#include<iostream>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW 2
typedef int Status;
typedef char SElemType;
//栈的顺序存储表示
#define STACK_INIT_SIZE 10 //存储空间初始分配量
#define STACKINCREMENT 2 //存储空间分配增量
struct SqStack
{
SElemType* base;//在栈构造之前和销毁之后,base的值为NULL
SElemType* top;//栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位
};//顺序栈
Status InitStack(SqStack& S);//构建一个空表
Status StackEmpty(SqStack S);//若栈S为空栈,返回TURE,否则返回FALSE
Status Push(SqStack& S, SElemType e);//插入元素e为新的栈顶元素
Status Pop(SqStack& S, SElemType& e);//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
void check()//**括号匹配检查**
{//对于输入的任意一个字符串,检验括号是否匹配成功
SqStack s;
SElemType ch[80], * p, e;
if (InitStack(s))//初始化成功
{
printf("请输入表达式");
gets_s(ch);
p = ch;
while (*p)
{
switch (*p)
{
case'(':
case'[':Push(s, *p++);
break;//左括号入栈,且p++
case')':
case']':if (!StackEmpty(s))//栈不空
{
Pop(s, e);//弹出栈顶元素
if (*p == '(' && e != ')' || *p == '[' && e != ']')//弹出的栈顶元素与*p不配对
{
printf("左右括号不配对\n");
exit(ERROR);
}
else
{
p++; break;//跳出switch
}
}
else //栈空
{
printf("缺乏左括号");
exit(ERROR);
}
default:p++;//其他字符不处理,指针后移
}
}
}
if (StackEmpty(s))//字符串结束时栈空
printf("括号匹配\n");
else
printf("括号不匹配\n");
}
int main()
{
check();
return 0;
}
Status InitStack(SqStack& S)//构建一个空表
{
if (!(S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType))))
exit(OVERFLOW);//存储分配失败
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status StackEmpty(SqStack S)//若栈S为空栈,返回TURE,否则返回FALSE
{
if (S.top == S.base)
return TURE;
else
return FALSE;
}
Status Push(SqStack& S, SElemType e)//插入元素e为新的栈顶元素
{
if (S.top - S.base >= S.stacksize)//栈满,追加存储空间
{
S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
if (!S.base)
exit(OVERFLOW);//存储分配失败
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*(S.top)++ = e;
return OK;
}
Status Pop(SqStack& S, SElemType& e)//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
{
if (S.top == S.base)
return ERROR;
e = *--S.top;
return OK;
}
调试结果如下
因为代码中用到了引用,所以需要用c++编译器,我用的是vs2019,有些函数可能和别的编译器长得不一样比如gets_s()