此练习是数据结构书中的练习。
编写这道程序有点慢,
主要回忆栈的线性结构存储,
其实就是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;
exit(OK);
}
}
cout << endl;
cout << "matching succssed" << endl;
free(P.base);//第一次修改
free(P.top);
P.top = P.base = NULL;
while(OK);
return OK;
}
执行结果:
之前了解MALLOC和FREE的操作,
本操作没有运用指针所以不用FREE?
最后栈为空栈,不用?
我用了有错误!!!说FREE中的不符合指针类型?
所以这是疑惑。
想一个晚上,红色为修改。
由于今天态度懒散,只是编写一道程序题,而且难度不大。
这要怎么惩罚自己。。。。