字尾表示式也叫作逆波蘭表示式,主要是運用棧的後進先出思想,下面就講講我自己的思考,
假設中綴表示式為: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...