棧的簡單應用之中綴表達式轉後綴表達式(C語言實現逆波蘭式)

1、前言

  普通人在書寫計算式時會選擇中綴表達式,這樣符合人腦的認知習慣。可計算機處理時後綴表達式才能使處理速度更快,其緣由是利用堆棧結構減小計算機內存訪問。同時它也是一個很好鍛鍊棧這個數據結構的應用的問題。如下是用c語言實現中綴表達式到後綴表達式的轉換的代碼。本文僅討論轉換,不涉及計算。實際上若是瞭解了棧是如何在這上面應用,計算和前綴、中綴、後綴的相互計算和轉換便簡單了許多。對於三隻種表達方式的轉換,還有的作法是創建二叉樹,錄入數據,三種不一樣的遍歷方式就是三種表達方式。本文如有錯誤歡迎指出。數據結構

2、代碼

#include <stdio.h>
int main(void)
{
    int top=-1;
    char s[25],temp;        //棧的大小根據須要更改,或者能夠用內存分配來解決
    while((temp=getchar())!='\n')
    {
        if(temp>='A'&&temp<='Z'||temp>='a'&&temp<='z'||temp>='0'&&temp<='9'||temp=='.')        //包含數字表達式和字母表達式,支持小數
            printf("%c",temp);
        else
        {
            if(temp=='*'||temp=='/')
            {
                while(top>=0&&(s[top]=='*'||s[top]=='/'))        //保證棧不會越界
                    printf("%c",s[top--]);
                s[++top]=temp;
            }
            else if(temp=='+'||temp=='-')
            {
                while(s[top]!='('&&top>=0)
                    printf("%c",s[top--]);
                s[++top]=temp;
            }
            else if(temp=='(')
                s[++top]=temp;
            else if(temp==')')
            {
                while(s[top]!='(')
                    printf("%c",s[top--]);
                top--;
            }
        }
    }
    while(top>=0)
        printf("%c",s[top--]);                //餘下運算符出棧
    return 0;
}

3、分析

1.轉換規則

  • 遇到數字字符直接輸出或通過轉換成數字後輸出
  • 遇到‘(’字符直接進棧
  • 遇到‘)’字符,將‘(’字符前的運算符依次出棧並輸出,‘(’字符只出棧,不輸出
  • 遇到運算符時,將優先級比此運算符小或等於的運算符依次出棧,再將其入棧
  • 讀取完整個串後,將棧中全部運算符出棧

2.注意事項

在寫判斷條件時注意邏輯要清晰,肯定出入棧不會越界,並且全部元素都正確的出入棧,不要有出棧遺漏或者入棧重疊的狀況,肯定全部轉換條件都完整的進行了表達,注意某些特殊狀況,儘可能作到全面。code

相關文章
相關標籤/搜索