题目: 在表达式中,只有【】和()两种括号,如(【】)【(【】【】)】等为正确格式,【(】)或【()或(()】)均为不正确格式。编写程序检验表达式序列是否正确。
一、分析与算法设计
- 检验方法描述:“期待的急迫程度”
- 可能出现的不匹配的情况:
①到来的有括号不是所“期待的”
eg (等到了【
②盗来的是“不速之客”;
eg(等到了】
③直到结束,也没有到来所“期待”的括号;
3.算法的设计思想:
1)凡出现左括号,一律进栈。
2)凡出现右括号,首先检查栈是否空:
若栈空,则表明该右括号多于→序列错误
否则,和栈顶元素比较,
若相匹配,则“左括号出栈”
否则表明不匹配,序列错误。
3)表达式检验结束时,若栈空,则表明表达式中匹配正确,否则表明“左括号”多于→序列错误。
二、代码实现
1.预处理和栈的定义
#include<iostream>
#include<stdlib.h>
#include<string.h>
#define Size 20
#define OK 1
#define ERROR 0
using namespace std;
typedef struct{
char *base;
char *top;
int stacksize;
}Stack;
2.栈的基本操作:
构造空栈:
void InitStack(Stack &S)
{
S.base=(char *)malloc(Size*sizeof(char));
if(!S.base)exit(-1);
S.top=S.base;
S.stacksize=Size;
//return OK;
}
入栈
void Push(Stack &S,char e)
{
*S.top++=e;
}
出栈
int Pop(Stack &S)
{
if(S.top==S.base)return ERROR;
*--S.top;
return true;
}
取栈顶元素
int getTop(Stack &S,char &e)
{
if(S.top-S.base==0)return ERROR;
e=*(S.top-1);
return OK;
}
判空
int stackEmpty(Stack &S)
{
if(S.base==NULL)exit(1);
return S.top-S.base?0:1;
}
3.括号匹配子函数:
int matching(Stack &S,char c[])
{
int i=0;
//int state=1;
char e;
while(i<strlen(c))
{
switch(c[i])
{
case '(':case '[':Push(S,c[i]);break;//凡是左括号,一律入栈
case ')':if(getTop(S,e)==0)return ERROR;
if(e=='(')
{
Pop(S);
break;//state=1;
}
else return ERROR;
case ']':if(getTop(S,e)==0)return ERROR;
if(e=='[')
{
Pop(S);
break;//state=1;
}
else return ERROR;
}
i++;
}
if(stackEmpty(S)) return OK;
}
4.主函数:
注:代码中的cout在纯C语言中可改为printf使用;cin可改为scanf使用
int main()
{
Stack S;
char c[20];
cout<<"请输入表达式:";
cin>>c;
InitStack(S);
int i=0;
if(matching(S,c))cout<<"合法";
else cout<<"不合法";
return 0;
}
小总结
核心思想:栈的先进后出的性质
关键:注意分类讨论时考虑到每一种情况