括號匹配(棧實現)
阿新 • • 發佈:2019-02-01
#include <stdio.h>
#include <malloc.h> //malloc,realloc
#include <math.h> //含有overflow
#include <process.h> //exit()
#define S_SIZE 100 //棧的空間大小
#define STACKINCREAMENT 10//增加空間
struct SqStack{
int *base; //棧底
int *top; //棧頂
int stacksize; //棧當前的儲存空間
};
int main()
{//子函式宣告
void InitStack(SqStack &S);//初始化空棧
int StackEmpty(SqStack S);//判空
void push(SqStack &S,int e);//進棧
int pop(SqStack &S,int &e);//出棧
//主函式開始
while(1) {
SqStack s;//初始化空棧
InitStack(s);
char ch[100],*p;int e;
p=ch;int flag =1;
printf("輸一個含義有()[]{}的括號表示式:\n" );
gets(ch);
while(*p)
{
switch (*p)
{
case '{':
case '[':
case '(': push(s,*p++);break;//只要是左括號就入棧
case '}':
case ']':
case ')':if(pop(s,e)) {exit(OVERFLOW);flag = 0;}
if ((e=='{' && *p=='}') ||(e=='[' && *p==']') || (e=='(' && *p==')'))
p++;
else
{printf("括號不匹配!");exit(OVERFLOW);}
break;
default :p++;//其他字元就後移
}
}
if (StackEmpty(s)&&flag)
printf("括號匹配成功");
else if(flag)
printf("缺少右括號!");
printf("\n");
}
}
void InitStack(SqStack &S)
{S.base=(int *)malloc(S_SIZE*sizeof(int));
S.stacksize=S_SIZE;
S.top=S.base;//初始化空棧
}
int StackEmpty(SqStack S)
{
if(S.base==S.top)
return 1;
else
return 0;
}
void push(SqStack &S,int e)
{//進棧
if(S.top-S.base>=S.stacksize)
{S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int));
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREAMENT;}
*(S.top)=e;
S.top++;
}
int pop(SqStack &S,int &e)
{//出棧
if(S.base!=S.top)
{S.top--;
e=*S.top;return 0;}
else {
printf("缺少左括號\n");return 1;}
}