3.2.2–栈的应用(括号匹配的检验)
《数据结构》严蔚敏版习题3.2.2,括号匹配问题。是顺序栈的课后习题。原问题:假设表达式中允许包括两种括号:圆括号和方括号,其嵌套方式随意,即(【】())等都是正确的格式,【(】)是不正确的格式。设计一个算法检查输入的字符串中的括号是否是匹配的。
思路:
建立数组遍历,遇到<{([则入栈>}])则进行匹配出栈操作,如不匹配则也压入栈。第一个元素为>}])直接为不匹配,最后栈为空说明括号匹配。
代码:
#include<iostream>//ZJJ数据据结构-栈3.2.2
using namespace std;
typedef int Status;
#define INITSIZE 100
#define INTREMENT 100
typedef struct {/*定义顺序栈*/
char* base;
char* top;
int size;
}SqStack;
Status InitStack(SqStack* s)/*创建(顺序栈)栈*/
{
s->base = (char*)malloc(INITSIZE * sizeof(char));
if (!s->base)
{
cout << "栈创建失败" << endl;
}
s->top = s->base;
s->size = INITSIZE;
return 1;
}
Status Push(SqStack* s, char e)//入栈
{
if (s->top - s->base >= s->size)
{
s->base = (char*)realloc(s->base, (s->size + INTREMENT) * sizeof(char));
if (!s->base)
{
cout << "栈创建失败" << endl;
exit(1);
}
s->top = s->base + s->size;
s->size += INTREMENT;
}
*(s->top) = e;
s->top++;
return 1;
}
Status Pop(SqStack* s, char* e)//出栈
{
if (!s->base)
{
cout << "栈创建失败" << endl;
exit(1);
}
s->top--;
*e =* (s->top);
return 1;
}
int StackLength(SqStack* s)//计算栈长度
{
return(s->top - s->base);
}
void Print(SqStack* s)//打印栈的剩余元素
{
if (!s->base)
{
cout << "栈创建失败" << endl;
exit(1);
}
char* t = s->top - 1;
while (t >= s->base)
{
cout << *t << endl;
t--;
}
}
Status StackEmpty(SqStack* s)//判断是否为空栈
{
if (s->top == s->base)
{
return 1;
}
else
return 0;
}
Status GetTop(SqStack* s, char* e)//获取栈的第一个元素
{
if (s->top == s->base)
{
return 0;
}
*e = *(s->top - 1);
return 1;
}
int main()
{
SqStack s, * sp = &s;
InitStack(sp);
char str[20];
cin >> str;
if (str[0] == ']' || str[0] == ')' || str[0] == '}' || str[0] == '>')//判断第一个元素是否符合
{
cout << "括号不匹配" << endl;
exit(0);
}
char c, d, * cp = &c, * dp = &d;
for (int i = 0, c = str[0];c != '\0';i++)//遍历各个元素进行出入栈的操作
{
c = str[i];
if (!StackEmpty(sp))
{
GetTop(sp, dp);
}
char t, * tp = &t;
switch (c)
{
case'[':
Push(sp, c);
break;
case'{':
Push(sp, c);
break;
case'<':
Push(sp, c);
break;
case'(':
Push(sp, c);
break;
case']':
{
if (d == '[')
{
Pop(sp, tp);
}
else
Push(sp, c);
break;
}
case'}':
{
if (d == '{')
{
Pop(sp, tp);
}
else
Push(sp, c);
break;
}
case'>':
{
if (d == '<')
{
Pop(sp, tp);
}
else
Push(sp, c);
break;
}
case')':
{
if (d == '(')
{
Pop(sp, tp);
}
else
Push(sp, c);
break;
}
break;
default:break;
}
}
cout << "当前栈长:" << StackLength(sp);
if (StackEmpty(sp))
cout << "括号匹配" << endl;
else {
cout << "括号不匹配" << endl;
}
Print(sp);
return 0;
}
实验结果:
有无欠缺的,欢迎指正。