棧的簡單應用之中綴表達式轉后綴表達式(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.注意事項

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM