C 利用棧實現中綴表示式轉字尾表示式

2022-10-03 23:15:19 字數 1669 閱讀 2159

題目:現有中綴表示式如: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 順...

棧 中綴表示式轉字尾表示式

中綴轉字尾的演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進棧 運算符號 與棧頂符號進行優先比較 若棧頂符號優先順序低 此符號進棧 預設棧頂若是左括號,則左括號的優先順序最低 若棧頂符號優先順序高 將棧頂符號彈出 並輸出 直到棧頂的符號優先順序低,然後進棧 右括號 將棧...