数据结构之括号匹配(C++,链栈方式实现)
发布网友
发布时间:2022-05-11 22:39
我来回答
共1个回答
热心网友
时间:2023-10-23 11:18
数据结构实验报告 括号匹配
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR 0
//定义顺序堆栈
#define STACK_SIZE 100 //存储空间初始分配量
#define STACK_INC 10 //存储空间分配增量
typedef char Elem;
typedef struct{
Elem *base; //栈底指针
Elem *top; //栈顶指针
int size; //当前已分配的存储空间
}SqStack;
typedef int Status;
//创建空堆栈,栈顶指针和栈底指针相等时,栈为空
Status CreatStack(SqStack &S){
S.base=(Elem *)malloc(STACK_SIZE*sizeof(Elem));
S.top=S.base;
S.size=STACK_SIZE;
return OK;
}
//堆栈是否为空
Status StackEmpty(SqStack S){
if(S.top!=S.base) return ERROR;
return OK;
}
//进栈
Status Push(SqStack &S,Elem e){
if(S.top-S.base>=S.size){ //栈满,追加存储空间
S.base=(Elem *)realloc(S.base,(S.size+STACK_INC)*sizeof(Elem));
S.top=S.base+S.size;
S.size+=STACK_INC;
}
*S.top=e;
S.top+=1;
return OK;
}
//出栈
Status Pop(SqStack &S,Elem &e){
if(S.top==S.base) return ERROR;
S.top-=1;
e=*S.top;
return OK;
}
//括号匹配
Status Bracket(SqStack &S,char *str){
int i=0,flag1=0,flag2;
Elem e;
while(str[i]!='\0'){
switch(str[i]){
case '(':Push(S,'(');break; //'('进栈
case '[':Push(S,'[');break; //'['进栈
case ')':{Pop(S,e);
if(e!='(') flag1=1; break;} //出栈,判断是否为'('
case ']':{Pop(S,e);
if(e!='[') flag1=1;break;} //出栈,判断是否为'['
default: break;
}
if(flag1) break; //出现不匹配,立即结束循环
i++;
}
flag2=StackEmpty(S); //flag2判断堆栈是否为空
if(!flag1 && flag2) printf("括号匹配!\n");
else printf("括号不匹配!\n");
return OK;
}
//主函数
void main()
{
char temp,flag='y';
while(flag=='y'){
char str[255];
SqStack S;
printf("请输入字符串:");
scanf("%s",str);
scanf("%c",&temp); //接受输入的回车键
CreatStack(S);
Bracket(S,str);
printf("你想再试一次吗(按y继续): ");
scanf("%c",&flag);
printf("\n");
}
printf("程序结束.\n");