目录
1 栈的基本应用
1.1 括号匹配
问题:
假设表达式有三种括号:圆括号“()”,花括号“{}”,方括号“[]”。它们可互相嵌套,如{([])}或{([])()[]}均为正确格式。而{)),{[()]均为不正确格式。
输入由三种括号构成的字符串,如何检测字符串里括号格式的正确性?
算法思路:
- 创建一个空栈,开始顺序扫描所有字符
- 遇到左括号入栈
- 遇到右括号则弹出已入栈的栈顶左括号(若栈为空没有左括号,直接退出报错)
- 检查两括号是否匹配(若两括号类型不一样,直接退出报错)
- 若所有字符都扫描完,检查栈里是否还剩余左括号(若栈里还有左括号剩余,则报错)
算法核心就是:遇到左括号就入栈,遇到右括号就弹出栈顶的左括号与右括号匹配
匹配失败有三种情况:
- 右括号单身(右括号要匹配时,栈已经为空)
- 左右括号不匹配
- 左括号单身(右括号匹配完,栈不为空)
实现代码:
bool isValid(char * s)
{
int len=strlen(s);
char stack[len];
int top=-1; //栈顶指针
for(int i=0;i<len;i++)
{
if((s[i]=='(')||(s[i]=='[')||(s[i]=='{'))
stack[++top]=s[i];
else
{
if(top==-1)
return false;
else
{
if((s[i]==')'&&stack[top]=='(')||(s[i]==']'&&stack[top]=='[')||(s[i]=='}'&&stack[top]=='{'))
top--;
else
return false;
}
}
}
if(top!=-1)
return false;
else
return true;
}
1.2 表达式转换求值
1.2.1 表达式转换(中缀转后缀、前缀)
中缀表达式:(我们正常手写的表达式):
「左操作数 运算符 右操作数 」(运算符 是写在 两个操作数 中间的)
如表达式:A + B * (C - D) – E / F
后缀表达式:
「左操作数