一、前言
普通人在書寫計算式時會選擇中綴表達式,這樣符合人腦的認知習慣。可計算機處理時后綴表達式才能使處理速度更快,其原因是利用堆棧結構減少計算機內存訪問。同時它也是一個很好鍛煉棧這個數據結構的應用的問題。以下是用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.注意事項
在寫判斷條件時注意邏輯要清晰,確定出入棧不會越界,而且所有元素都正確的出入棧,不要有出棧遺漏或者入棧重疊的情況,確定所有轉換條件都完整的進行了表達,注意某些特殊情況,盡量做到全面。