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

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

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

#三、分析 ##1.轉換規則

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

##2.注意事項 在寫判斷條件時注意邏輯要清晰,確定出入棧不會越界,而且所有元素都正確的出入棧,不要有出棧遺漏或者入棧重疊的情況,確定所有轉換條件都完整的進行了表達,注意某些特殊情況,儘量做到全面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章