| 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;
}
|