1.1 栈在括号匹配中的应用
假设表达式中允许包含三种括号:圆括号“( )”,中括号“[ ]”,花括号“{ }”。其嵌套顺序任意,即{ ( ( [ ] ) ) }或{ ( [ ] [ ] )}等均为正确的格式,{ ) [ ] ( }或{ [ ] ( ) {等均为不正确的格式。
则:输入由以上三种括号构成的字符串,如何判断字符串里括号格式的正确性?
问题分析:
1.最后出现的左括号最先被匹配(LIFO)——“栈”。
2.每出现一个右括号,就“消耗”一个左括号——“出栈”。
算法思路:
1.创建一个空栈,开始顺序扫描所有字符。
2.扫描到左括号,入栈。
3.扫描到右括号,则弹出栈顶元素(已入栈的左括号)。若栈为空,则退出报错。
4.检查两个括号是否匹配。若不匹配,则退出报错。
5.扫描完所有字符后,检查是否栈空,栈空说明匹配成功。若栈不空,说明还有左括号剩余,则退出报错。
匹配失败的三种情况:
1.右括号单身(右括号要匹配,栈已空)。
2.左右括号不匹配。
3.左括号单身(右括号匹配完,栈不为空)。
实现代码:
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
char data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack;
//初始化栈
void InitStack(SqStack &S){
S.top = -1;
}
//判断栈是否为空
bool StackEmpty(SqStack S){
if(S.top==-1) //栈空
return true;
else
return false;
}
//新元素入栈
bool Push(SqStack &S,char x){
if(S.top=