對於平時我們書寫的算術表示式是
12 * ( 3 + 4 ) - 6 + 8 / 2這種習慣的寫法是中綴表示式
但是計算機一般執行方式是字尾表示式,從左向右依次執行
12 3 4 + * 6 - 8 2 / +這就是字尾表示式
這個是如何轉換的呢
有兩種
1.根據樹的遍歷
2.利用棧
今天主要說的是利用棧的轉換
中綴表示式轉換為字尾表示式
1.建立棧2.從左向右順序獲取中綴表示式
a.數字直接輸出
b.運算子
遇到』 ( 『直接入棧,遇到』 ) 『將棧中『 ( 『之後入棧的全部輸出,同時『 ( 『出棧但是不輸出。其他符號將符號棧中的元素依次出棧並輸出,直到遇到比當前符號優先順序更低的符號或者』 ( 『,將當前符號入棧。
3.獲取完後,將棧中剩餘的符號依次輸出
例如:12 * (3 + 4) - 6 + 8 / 2
依次獲取:
12 ,是數字,直接輸出
字尾表示式:12』 * 』 ,是運算子,入棧符號棧:
字尾表示式:12』 ( 『,左括號,直接入棧符號棧:*
字尾表示式:123 , 數字 ,輸出符號棧: * (
字尾表示式:12 3『 + 』,運算子 ,入棧符號棧: * (
字尾表示式:12 34 ,數字,輸出符號棧: * ( +
字尾表示式:12 3 4『 )』,右括號,棧中元素依次出棧並輸出知道遇到左括號,並且左括號也要出棧且不輸出符號棧: * ( +
字尾表示式:12 3 4 +『 - 』,操作符,減號的優先順序低於乘號所以乘號出棧並輸出,此時站內沒有符號,減號入棧符號棧: *
字尾表示式:12 3 4 + *6 ,數字,輸出符號棧: -
字尾表示式:12 3 4 + * 6』 + 『,操作符 ,優先順序與減號相同(也就是說沒有減號的優先順序高)所以減號出棧輸出,加號入棧符號棧: -
字尾表示式:12 3 4 + * 6 -8 ,數字 ,輸出符號棧: +
字尾表示式:12 3 4 + * 6 - 8『 / 』,操作符,比減號的優先順序高直接入棧符號棧: +
字尾表示式:12 3 4 + * 6 - 82 ,數字,輸出符號棧: + /
字尾表示式:12 3 4 + * 6 - 8 2以上就是中綴表示式轉字尾表示式符號棧: + /
中綴表示式獲取完後,將棧中剩餘元素依次出棧輸出
字尾表示式:12 3 4 + * 6 - 8 2 / +
符號棧:
轉換了之後也要知道字尾表示式是怎麼計算的
還是要利用棧
最後的結果就是:82
下面是乙個關於字尾表示式計算的函式,可以參考:
結構體定義:
主要函式:#define max 100
typedef
char datatype;
typedef
struct stack //棧
stack;
enum operate; //列舉
typedef
struct cell
cell;
測試:void stackinit(stack* p) //棧的初始化
void stackpush(stack* p, datatype data) //入棧
else
}int stackpop(stack* p)//出棧
}int stacktop(stack* p)//取棧頂元素
return0;}
int calrpn(cell* rpn, int sz)//逆波蘭表示式(字尾表示式)
}return stacktop(&s);
}
void rpntest()
,,,,,,
,,,, };
int sz = sizeof(rpn) / sizeof(rpn[0]);
int ret = calrpn(rpn, sz);
printf("%d\n", ret);
}
計算字尾表示式 C語言實現
程式相對簡單易懂,執行程式,在命令列中輸入 123 注意 由於輸入字元,以 結束 輸出 5.000000 include include typedef struct stack 建立乙個棧,100為maxsize,define無法定義 void createstack stack s 棧頂指標 f...
計算器 字尾表示式
不過目前這個功能太少,而且能算的十分有限,測試輸入為 4 4 5 3 測試輸出為 4 4 5 3 27 主要就是了解一下怎麼把中綴表示式轉化成字尾表示式,然後再利用字尾表示式求值,我後續會完善這個程式,做個真正意義上的計算器。o o 轉化步驟我搜尋了一下,大致如下 將中綴表示式轉換為等價的字尾表示式...
計算器(表示式計算 字尾表示式實現)逆波蘭表示式
問題描述 從標準輸入中讀入乙個整數算術運算表示式,如24 1 2 36 6 2 2 12 2 2 計算表示式結果,並輸出。要求 1 表示式運算子只有 表示式末尾的 字元表示表示式輸入結束,表示式中可能會出現空格 2 表示式中會出現圓括號,括號可能巢狀,不會出現錯誤的表示式 3 出現除號 時,以整數相...