根据真题需求,主要再回顾一下栈在括号匹配 、表达式求值和共享栈的运用。
1、括号匹配
问题描述:
算法思想:①若是左括号,入栈;②若是右括号,出栈一个左括号判 断是否与之匹配;③检验到字符串尾时,还要检查栈是否为空,只有栈空,整个字符串才是括号匹配的。
算法实现:
bool check(char str)
{
stack s;
InitStack(s);
int len = strlen; //字符串长度
for(int i=0;i<len;i++)
{
char a = str[i];
switch(a)
{
case'(':
case'[':
Push(s,a);
break;
case')':
if(Pop(s)!='(')
return false;
break;
case']':
if(Pop(s)!='[')
return false;
break;
}
}
if(Empty(s))
return true;
else
return false;
}
2、表达式求值
问题描述:
实现思想:
从左到右扫描表达式的每个数字和符号,遇到数字就进栈,遇到符号就将处于栈顶的两个数字出栈然后跟这个符号进行运算,最后将运算结果进栈,直到最终获得结果。
实现案例:
将中缀转换为后缀:
① 按运算符优先级对所有运算符和它的运算数加括号。(原本的括号不用加)
② 把运算符移到对应的括号后。
③ 去掉括号。
3、共享栈
问题描述:
共享栈的结构:
#define Max 100 //栈中元素最大个数
typedef struct
{
Elemtype data[Max];
int top1; //栈1栈顶元素
int top2; //栈2栈顶元素
}ShareStack;
栈满/栈空条件:
ShareStack S;
S.top1+1==S.top2 //栈满
S.top1=-1,S.top2=MAX; //栈空
进栈操作:
bool Push(ShareStack &S ,ElemType x,int stackNum)
{
if(S.top1+1==S.top2)
return false;
if(stackNum==1)
S.data[++S.top1]=x; //栈1有元素进栈
else if(stackNum==2)
S.data[--S.top2]=x; //栈2有元素进栈
return true;
}