Logická spojka ∧ (konjunkce) tady není komutativní ona a i ⇒ (implikace): předepisuje pořadí vyhodnocovaných funkcí a prováděných operací | |||
Axiomy | jePlná(F) | ⇒ | ~vlož(F, něco) |
---|---|---|---|
inicialisuj(F) | ⇒ | jePrazdná(F) | |
inicialisuj(F) ∧ vlož(F, A) | ⇒ | vyjmi(F, něco) ∧ něco = A | |
inicialisuj(F) ∧ vlož(F, A) ∧ ~jePlná(F) ∧ vlož(F, B) | ⇒ | vyjmi(F, něco) ∧ něco = A ∧ vyjmi(F, něco) ∧ něco = B | |
inicialisuj(F) ∧ vlož(F, A) | ⇒ | naVyjmuti(F, něco) ∧ něco = A | |
inicialisuj(F) ∧ vlož(F, B) ∧ ~jePlná(F) ∧ vlož(F, A) | ⇒ | naVyjmuti(F, něco) ∧ něco = B ∧ naVyjmuti(F, něco) ∧ něco = B | |
~jePlná(F) ∧ vlož(F, A) | ⇒ | ~jePrazdná(F) | |
jePrazdná(F) | ⇒ | ~vyjmi(F, něco) |
Vkládá se a vyjímá ve všech případech jen po znacích. | |||
Analogicky k zásobníku budeme mít indexy dva: jeden pro vkládání a jeden pro vyjímání | Když pole zakroutíme dostaneme: | ||
Pokud bychom při každém výjmutí posunuli všechny uložené prvky
o jedna doleva, ztratili bychom hlavní výhodu implementace polem: Jednoduchost a rychlost. | Jak vidíme na prvním a třetím obrázku (v tomto sloupci), jak u prázdné tak u plné fronty ukazují v obou případech oba indexy na stejný znak a nejde rozlišit, který z těch dvou stavů nastal. Je lepší uchovávat pouze jeden z oněch indexů a počet. A druhý dopočítávat. | ||
Zakroucení nemůžeme zrealisovat hardwareově. Musíme ho simulovat pomocí zbytku po dělení. |
je opět NULL . |
typedef struct mmbr { valueType value; struct mmbr *next; } member; typedef struct { member *a; member *b; } queue; |
queue.h
:
/** * Head file for queue operations * * @file queue.h * @author A. Zlamal * @version 2020 04 17 * */ /** * Inicialize the given queue. * * Inicializuje zadanou frontu. * * @param[in, out] s the address of the queue to inicialize. * adresa fronty, jenz se ma inicialisovat. * * @param[in] sz the size of the queue to inicialize. * IN CASE OF IMPLEMENTATION BY LINKED LIST DATA OF SIZE IS OMITTED. * velikost fronty, jez se ma inicialisovat. * V PRIPADE IMPLEMENTACE SPOJOVYM SEZNAMEM SE UDAJ VELIKOSTI OPOMIJI. */ void inicialisuj(queue *q, unsigned int sz); /** * Enqueue the value of the second parametr to the queue pointed by the first parametr. * Vlozi hodnotu druheho parametru do fronty zadane prvním parametrem. * * @param[in, out] s the address of the queue, into which is to be enqueued. * adresa fronty, do niz se ma vlozit. * * @param[in] pv the value, which is to enqueueue. * hodnota jenz se se ma vlozit. * IMPORTANT WARNING: REACTION ON THE ENQUEUE TO FULL QUEUE IS NOT DEFINED * AND WITH HIGH PROBABILITY CAUSES FATAL ERROR. * BEFORE ENQUEUE TEST THE QUEUE BY FUNCTION |
main.c
:
#include <stdlib.h> #include <stdio.h> #include <string.h> #include "definedTypeForArray.h" #include "queue.h" /** * Program to demonstrate functions for queue * * @file main.c * @author A. Zlamal * @version 2020 04 17 */ int main(){ valueType y; queue f; int isf; char *formStr = "Fronta je plna: hodnota %s se uz nevesla.\n"; inicialisuj(&f, 8); printf("Zadavejte na radky znakove retezce. Ta se budou vkladat do fronty.\n" "Zadavani se ukoncuje prazdnym radkem.\n"); while ((fgets(y, TEXT_LENGTH, stdin) != NULL) && (*y != '\n') && !(isf = jePlna(&f))) { y[strlen(y) - 1] = '\0'; vloz(&f, &y); } if (isf) { y[strlen(y) - 1] = '\0'; printf(formStr, y); } printf("Konec vkladani do fronty a nejvyse dvakrat vyber z ni.\n"); if (!jePrazdna(&f)) { naVyjmuti(&f, &y); printf(" %s :: ", y); vyjmi(&f, &y); printf("%s\n", y); } if (!jePrazdna(&f)) { naVyjmuti(&f, &y); printf(" %s :: ", y); vyjmi(&f, &y); printf("%s\n", y); } printf("Nasleduje dalsi vkladani do fronty a vyber vseho z ni:\n"); while ((fgets(y, TEXT_LENGTH, stdin) != NULL) && (*y != '\n') && !(isf = jePlna(&f))) { y[strlen(y) - 1] = '\0'; vloz(&f, &y); } if (isf) { y[strlen(y) - 1] = '\0'; printf(formStr, y); } while (!jePrazdna(&f)) { naVyjmuti(&f, &y); printf(" %s :: ", y); vyjmi(&f, &y); printf("%s\n", y); } printf("\nNasleduje dalsi vkladani do fronty a opet vyber vseho z ni:\n"); while ((fgets(y, TEXT_LENGTH, stdin) != NULL) && (*y != '\n') && !(isf = jePlna(&f))) { y[strlen(y) - 1] = '\0'; y[strlen(y) - 1] = '\0'; vloz(&f, &y); } if (isf) { printf(formStr, y); } while (!jePrazdna(&f)) { naVyjmuti(&f, &y); printf(" %s :: ", y); vyjmi(&f, &y); printf("%s\n", y); } uvolniPamet(&f); printf("Byla uvolnena pamet zasobniku: %s.\nKonec chodu programu.\n", f == NULL ? "NULL" : f->values[0]); return EXIT_SUCCESS; } |