-
Notifications
You must be signed in to change notification settings - Fork 1
/
c202.c
executable file
·147 lines (130 loc) · 4.99 KB
/
c202.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/* ******************************* c202.c *********************************** */
/* Předmět: Algoritmy (IAL) - FIT VUT v Brně */
/* Úkol: c202 - Zásobník znaků v poli */
/* Referenční implementace: Petr Přikryl, 1994 */
/* Vytvořil: Václav Topinka, září 2005 */
/* Úpravy: Bohuslav Křena, říjen 2013 */
/* ************************************************************************** */
/*
** Implementujte datový typ zásobník znaků ve statickém poli. ADT zásobník je
** reprezentován záznamem typu tStack. Statické pole 'arr' je indexováno
** do maximální hodnoty STACK_SIZE. Položka záznamu 'top' ukazuje na prvek
** na vrcholu zásobníku. Prázdnému zásobníku odpovídá hodnota top == -1,
** zásobníku s jedním prvkem hodnota 0, atd. Přesnou definici typů neleznete
** v hlavičkovém souboru c202.h.
**
** Implementujte následující funkce:
**
** stackInit .... inicializace zásobníku
** stackEmpty ... test na prázdnost zásobníku
** stackFull .... test na zaplněnost zásobníku
** stackTop ..... přečte hodnotu z vrcholu zásobníku
** stackPop ..... odstraní prvek z vrcholu zásobníku
** stackPush .... vloží prvku do zásobníku
**
** Své řešení účelně komentujte!
**
** Terminologická poznámka: Jazyk C nepoužívá pojem procedura.
** Proto zde používáme pojem funkce i pro operace, které by byly
** v algoritmickém jazyce Pascalovského typu implemenovány jako
** procedury (v jazyce C procedurám odpovídají funkce vracející typ void).
**
**/
#include "c202.h"
int STACK_SIZE = MAX_STACK;
int solved;
void stackError ( int error_code ){
/* ----------
** Vytiskne upozornění, že došlo k chybě při práci se zásobníkem.
**
** TUTO FUNKCI, PROSÍME, NEUPRAVUJTE!
*/
static const char* SERR_STRINGS[MAX_SERR+1] = {"Unknown error","Stack error: INIT","Stack error: PUSH","Stack error: TOP"};
if ( error_code <= 0 || error_code > MAX_SERR )
error_code = 0;
printf ( "%s\n", SERR_STRINGS[error_code] );
err_flag = 1;
}
void stackInit ( tStack* s ) {
/* ---------
** Provede inicializaci zásobníku - nastaví vrchol zásobníku.
** Hodnoty ve statickém poli neupravujte - po inicializaci zásobníku
** jsou nedefinované.
**
** V případě, že funkce dostane jako parametr s == NULL,
** volejte funkci stackError(SERR_INIT). U ostatních funkcí pro zjednodušení
** předpokládejte, že tato situace nenastane.
*/
if(s == NULL)
{
stackError(SERR_INIT);
return;
}
s->top = -1; //Nastavena hodnota vrcholu zasobniku
}
int stackEmpty ( const tStack* s ) {
/* ----------
** Vrací nenulovou hodnotu, pokud je zásobník prázdný, jinak vrací hodnotu 0.
** Funkci implementujte jako jediný příkaz. Vyvarujte se zejména konstrukce
** typu "if ( true ) b=true else b=false".
*/
return ( s->top == -1 ) ? s->top : 0;
}
int stackFull ( const tStack* s ) {
/* ---------
** Vrací nenulovou hodnotu, je-li zásobník plný, jinak vrací hodnotu 0.
** Dejte si zde pozor na častou programátorskou chybu "o jedničku"
** a dobře se zamyslete, kdy je zásobník plný, jestliže může obsahovat
** nejvýše STACK_SIZE prkvů a první prvek je vložen na pozici 0.
**
** Funkci implementujte jako jediný příkaz.
*/
return (s->top == STACK_SIZE -1) ? s->top : 0;
}
void stackTop ( const tStack* s, char* c ) {
/* --------
** Vrací znak z vrcholu zásobníku prostřednictvím parametru c.
** Tato operace ale prvek z vrcholu zásobníku neodstraňuje.
** Volání operace Top při prázdném zásobníku je nekorektní
** a ošetřete ho voláním funkce stackError(SERR_TOP).
**
** Pro ověření, zda je zásobník prázdný, použijte dříve definovanou
** funkci stackEmpty.
*/
if(stackEmpty(s) == 0)
(*c) = s->arr[s->top] ; //Znak ktory sa nachadza na vrchole zasobnika bude priradeny do parametru c...ak nieje zasobnik prazdny
else
stackError(SERR_TOP);
}
void stackPop ( tStack* s ) {
/* --------
** Odstraní prvek z vrcholu zásobníku. Pro ověření, zda je zásobník prázdný,
** použijte dříve definovanou funkci stackEmpty.
**
** Vyvolání operace Pop při prázdném zásobníku je sice podezřelé a může
** signalizovat chybu v algoritmu, ve kterém je zásobník použit, ale funkci
** pro ošetření chyby zde nevolejte (můžeme zásobník ponechat prázdný).
** Spíše než volání chyby by se zde hodilo vypsat varování, což však pro
** jednoduchost neděláme.
**
*/
if(stackEmpty(s) == 0 ) //Odstrani prvok z vrcholu zasobniku ak nieje prazny..inak sa nic nedeje
s->top--;
}
void stackPush ( tStack* s, char c ) {
/* ---------
** Vloží znak na vrchol zásobníku. Pokus o vložení prvku do plného zásobníku
** je nekorektní a ošetřete ho voláním procedury stackError(SERR_PUSH).
**
** Pro ověření, zda je zásobník plný, použijte dříve definovanou
** funkci stackFull.
*/
if(stackFull(s) == 0)
{
(s->top)++ ; //Inkrementujeme hodnotu ukazatela na vrchol zasobniku
s->arr[s->top] = c; // a vlozime na tuto poziciu znak z parametru c
}
else
stackError(SERR_PUSH); //Do plneho zasobniku nemozeme vkladat nic
}
/* Konec c202.c */