中綴表示式轉化為字尾表示式(逆波蘭表示式)

2021-09-01 12:36:24 字數 1824 閱讀 5190

字尾表示式也叫作逆波蘭表示式,主要是運用棧的後進先出思想,下面就講講我自己的思考,

假設中綴表示式為:2*(2+1)-6(4-2)#,則字尾表示式為:2 2 1 + * 6 4 2 - / -;

首先依次遍歷中綴表示式,遇到運算元字元則直接輸出(數字字元大小區間在 『0』~『9』),遇到操作符字元則依次入棧,其中操作符入棧條件:

若棧中沒有元素,即棧空,無條件入棧。

若為左括號「( 」,無條件入棧。

若為右括號" ) ",則依次輸出棧中的運算子,直到遇到左括號「(」為止。

若為非括號操作符,則比較此時遍歷到的操作符和棧頂元素,並判斷元素優先順序(優先順序和平常運算的先後一樣),如果棧頂的元素優先順序較高或者相等,則彈出棧頂元素並輸出,將遍歷到的操作符入棧。若遍歷的操作符優先順序較高,則直接入棧。

遍歷到「#」時,結束遍歷,判斷棧是否為空,若棧不為空,依次輸出棧頂元素,直至棧為空。

注意:右括號「)」不進棧,只是為了更好地表達,實際不進棧

附上自己寫的**吧!!

//#include "stdafx.h"

#include "stdlib.h"

typedef char elemtype;

#define stackinitsize 100

#define stackincrement 10

typedef struct sqstacksqstack;

typedef structsqlist;

void initlist(sqlist *l)

void initstack(sqstack *s)

void push(sqstack *s,elemtype e)

*((*s).top)=e;

(*s).top++;

}void pop(sqstack *s,elemtype *e)

void getpop(sqstack s,elemtype *e)

int emptystack(sqstack s)

int precede(elemtype e,elemtype a)

void inversepolandexpression(sqstack s,elemtype str,sqlist *l)//逆波蘭

else

}if(str[i]=='+' || str[i]=='-' || str[i]=='*' || str[i]=='/')}}

} i++; }

while(!emptystack(s))

printf("\n");

}/*void print(sqlist *l)

printf("\n");

}*/int calculate(elemtype a,elemtype b,elemtype optr)

if(optr=='-')

if(optr=='*')

if(optr=='/')

return n;

}void calvalinverpoland(sqlist l)//字尾表示式求值

else

i++;

} getpop(opnd,&e);

printf("%c",e);

printf("\n");

}int main(int argc, char* argv)

後面因為臨時加入了字尾表示式求值,就用了乙個線性表來儲存字尾表示式。

中綴表示式轉化為字尾表示式

注意 中綴表示式需要空格隔開運算元或者操作符 關鍵有 判斷是否操作符,操作符優先順序 public class profixexpression 計算排好的字尾操作計算式 param prostr return public static intprofixcalculate string pros...

中綴表示式轉化為字尾表示式

中綴表示式轉化為字尾表示式有兩種方法,一種是利用棧,一種是把表示式轉化為樹再進一步求解,今天我們來深入了解一下這兩種方法 給出下面乙個例子 我們把中綴表示式 9 3 1 3 10 2 轉化為字尾表示式 1.首先初始化乙個空棧,用來對符號進出棧使用 2.第乙個字元是數字9,輸出9,將後面的符號 進棧 ...

中綴表示式轉化為字尾表示式

中綴表示式轉化為字尾表示式 例如 1 2 3 4 7 5 123 4 75 1 遇到數字輸出,否則進棧。2 遇到有右括號匹配棧裡的左括號,輸出棧裡的內容 3 遇到比自己比棧裡的運算子優先順序高,入棧 4 遇到比自己比棧裡的運算子優先順序低,將棧裡的運算子出棧 include include incl...