題目:現有中綴表示式如:1+(2-3)*4+10/5
請用棧的特性編寫乙個程式,使得程式輸出字尾表示式
分析如下:
step1:
1+(2-3)*4+10/5
首先遇到第乙個輸入是數字1,數字在字尾表示式中都是直接輸出,接著是符號「+」,入棧:
step2:
1+(2-3)*4+10/5
第三個字元是「(」,依然是符號,入棧,接著是數字2,輸出,然後是符號「-」,入棧:
step3:
1+(2-3)*4+10/5
接下來是數字3,輸出,緊跟著是「)」,此時,我們需要去匹配棧裡的「(」,然後再匹配前將棧頂資料依次出棧(這就好比括號裡優先執行的道理):
step4:
1+(2-3)*4+10/5
緊接著是符號「*」,直接入棧
step5:
1+(2-3)*4+10/5
遇到數字4,輸出,之後是符號「+」,此時棧頂元素是符號「*」,按照先乘除後加減原理,此時棧頂的乘號優先順序比即將入棧的加好要大,所以出棧。
程式設計客棧棧中第二個元素是加號,按理來說大家平起平坐,但是按照先來後到的原則,棧裡的加號呆得太久了,也要出棧透透氣。(同理如果棧裡還有其他操作符,也是出棧)
最後把剛剛的那個加號入棧,操作如下圖:
step6:
1+(2-3)*4+10/5
緊接著數字10,輸出,最後是符號「/」,進棧:
step7:
1+(2-3)*4+10/5
最後乙個數字5,輸出,所有的輸入處理完畢,但是棧中仍然有資料,所以將棧中符號依次出棧。
總結規則:
從左到右遍歷中綴表示式的每個數字和符號,若是數字則直接輸出,若是符號,則判斷其與棧頂符號的優先順序,是右括號或者優先順序低於棧頂符號,則棧頂元素依次出棧並輸出,直到遇到左括號或棧空才將低優先順序的那個符號入棧
**實現如下:
#include 程式設計客棧t;
#include
#define stack_init_size 20
#defi程式設計客棧ne stackincrement 10
typedef char elemtype;
typedef struct
sqstack;
initstack(sqstack *s)
push(sqstack *s, elemtype e)
*(s->top) = e; // 存放資料
s->top++;}
pop(sqstack *s, elemtype *e)
int stacklen(sqstack s)
int main()
} if( ')' == c )
}else if( '+'==c || '-'==c )
else
else
}while( stacklen(s) && '('!=e );
push(&s, c);
}} else if( '*'==c || '/'==c || '('==c )
else if( '#'== c )
else
scanf("%c", &c); }
while( stacklen(s) )
return 0;
}本文標題: c++利用棧實現中綴表示式轉字尾表示式
本文位址:
利用棧實現中綴表示式轉字尾表示式
中綴表示法 或中綴記法 是乙個通用的算術或邏輯公式表示方法,操作符是以中綴形式處於運算元的中間 例 3 4 與字首表示式 例 3 4 或字尾表示式 例 3 4 相比,中綴表示式不容易被電腦解析,但仍被許多程式語言使用,因為它符合人們的普遍用法。逆波蘭表示法 reverse polish notati...
C用棧實現中綴表示式轉字尾表示式
include include include define maxsize 100 設順序表的最大長度為100,可依具體情況分配空間 typedef char datatype typedef struct datatype data maxsize int top 棧頂指標 seqstack 順...
棧 中綴表示式轉字尾表示式
中綴轉字尾的演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進棧 運算符號 與棧頂符號進行優先比較 若棧頂符號優先順序低 此符號進棧 預設棧頂若是左括號,則左括號的優先順序最低 若棧頂符號優先順序高 將棧頂符號彈出 並輸出 直到棧頂的符號優先順序低,然後進棧 右括號 將棧...