栈的三个简单应用

根据真题需求,主要再回顾一下栈在括号匹配表达式求值共享栈的运用。

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; 
}
原文地址:https://www.cnblogs.com/wangzheming35/p/13707092.html