此練習是數據結構書中的練習。
編寫這道程序有點慢,
主要回憶棧的線性結構存儲,
其實就是top加1減1操作,
注意的是出棧的時候判斷是否空棧?
入棧的時候判斷是否滿棧?
#include <stdlib.h>
#include <iostream>
using namespace std;
#define uchr unsigned char
#define OK 1
#define ERROR 0
#define INITSIZESTACK 6
#define INCREAMSTACK 2
typedef struct {
uchr *top;
uchr *base;
int sizestack;
}Stack;
bool InitStack(Stack &S) {
S.sizestack = INITSIZESTACK;
S.base = (uchr *)malloc(S.sizestack*sizeof(uchr));
if(!S.base) return ERROR;
S.top = S.base;
return OK;
}
bool PopStack(Stack &S,uchr &elem) {
if(S.top == S.base) return ERROR;
elem = *--S.top;
return OK;
}
bool PushStack(Stack &S,uchr elem) {
if(S.top - S.base >= S.sizestack ) {
cout << "OVERFLEW!" << endl;
return ERROR;
}
*S.top++ = elem;
return OK;
}
int main() {
Stack P;
uchr sk[6] = {'{','[','(',')',']','}'};
uchr pelem,i;
InitStack(P);
for(i = 0;i < 6; i++) {
cout << sk[i];
if(i < 5 ) cout << ",";
else cout << endl;
}
for(i = 0;i < 6; i++) {
switch(sk[i]) {
case '{':
case '[':
case '(':
PushStack(P,sk[i]);
break;
case '}':
PopStack(P,pelem);
if(pelem == '{') cout << "{}" ;
else {
cout << "ERROR!!!" <<endl;
exit(OK);
}
break;
case ']':
PopStack(P,pelem);
if(pelem == '[') cout << "[]" ;
else {
cout << "ERROR!!!" <<endl;
exit(OK);
}
break;
case ')':
PopStack(P,pelem);
if(pelem == '(') cout << "()" ;
else {
cout << "ERROR!!!" <<endl;
exit(OK);
}
break;
default:
cout << "the end!" << endl;
while(OK); return OK;}exit(OK);
} } cout << endl; cout << "matching succssed" << endl; free(P.base);//第一次修改 free(P.top); P.top = P.base = NULL;
執行結果:
之前瞭解MALLOC和FREE的操作,
本操作沒有運用指針所以不用FREE?
最後棧爲空棧,不用?
我用了有錯誤!!!說FREE中的不符合指針類型?
所以這是疑惑。
想一個晚上,紅色爲修改。
由於今天態度懶散,只是編寫一道程序題,而且難度不大。
這要怎麼懲罰自己。。。。