1. 程式人生 > 實用技巧 >棧的三個簡單應用

棧的三個簡單應用

根據真題需求,主要再回顧一下棧在括號匹配表示式求值共享棧的運用。

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; 
}