棧的應用 中綴表示式轉字尾表示式並求值

2021-08-22 13:06:34 字數 2177 閱讀 6872

棧的一些功能函式,這邊用到的是鏈式棧。

typedef char elemtype;

//結點的資訊

struct node

;typedef struct node node;

//棧的資訊

struct stack

;typedef struct stack stack;

//初始化

int stackinit(stack **s)

//初始化只要分配棧資訊結構體的空間,結點的空間等到進棧的時候再分配。

//進棧:

int push(stack **s, elemtype e)

//出棧:

int pop(stack **s)

首先定義兩個棧,乙個叫s_num用來存放運算元,另乙個叫s_opt用來存放操作符。

再定義乙個字元陣列用來存放輸入的表示式,初始化為0;

當表示式的字元不為『/0』時,或者操作符棧中不為空的時候,就要一直執行程式!

在執行的時候做兩個判斷,輸入的不是數字就是操作符,當輸入數字的時候進棧就可以了,並且i++,遍歷下乙個。

當遇到操作符時:有三種情況

1.操作符棧為空的時候。

2.操作符的優先順序大於棧頂元素的時候。

3.當棧頂元素為』(『時,並且輸入不為')'時。

二、出棧不計算(結束後,i++,遍歷下乙個字元)

1.操作符出棧不計算的情況只有一種情況就是「(  」操作符出棧的時候。

當輸入為「  )」時,並且棧頂為「(  」時,就是兩個符號相遇時,出棧「(  」並不計算。

三、出棧計算(計算完將數字存入s_num中就可以了,不需要遍歷下乙個字元)

將輸入的字元與棧頂元素比較,滿足情況的話將棧頂元素出棧,並取num棧中的數字進行運算,這是不需要i++,遍歷下乙個輸入字元,break後再將輸入的字元與棧頂元素比較,判斷是入棧還是出棧!!!

1.輸入的操作符為"/0"的時候,並且操作符棧不為空的時候,要將操作符中的所有元素出棧運算。

2.輸入的操作符優先順序小於或等於棧頂元素時。

3.當輸入的字元為「  )」時,並且棧頂元素不為「(  」時。

#include #include "linkstack.h"

int priority(char ch)

}int main()

; //存放表示式

int i = 0, tmp = 0, num1 = 0, num2 = 0;

if (stackinit(&s_opt) != success || stackinit(&s_num) != success)

printf("please input : \n");

scanf("%s", opt);

while (opt[i] != '\0' || stackempty(s_opt) != true) //表示式沒結束 或者 操作符棧不為空 一直執行這個迴圈

}else //如果輸入是操作符 分三種情況

if (stackempty(s_opt) == true || (priority(opt[i]) > priority(gettop(s_opt)))

|| (gettop(s_opt) == '(' && opt[i] != ')'))

//2.操作符進棧,三種可能

1)操作符棧為空的時候,

2)操作符優先順序大於棧頂的時候,

3)棧頂為『(』時任何操作符都能進棧,除了『)』!

if ((opt[i] == '\0' && stackempty(s_opt) != true) ||

(opt[i] == ')' && gettop(s_opt) != '(') ||

(priority(opt[i]) <= priority(gettop(s_opt))))

//3.操作符出棧平取運算元棧的前兩個進行計算,三種可能

1)當表示式輸入結束接收到字元'\0'時並且操作符棧不為空的時候,這時候要將操作符棧出光,

2)輸入遇到字元『)』時,棧頂不為『(』時,

3)當輸入操作符的優先順序小於等於棧頂操作符優先順序的時候

}} }

printf("%d\n", gettop(s_num));

return 0;

}

棧的應用 中綴表示式轉字尾表示式

有關棧api詳情請參看我的另一篇博文 棧的鏈式儲存 api實現 例項 5 4 5 4 1 2 3 1 2 3 8 3 1 5 8 3 1 5 中綴表示式符合人類的閱讀和思維習慣 字尾表示式符合計算機的 運算習慣 中綴轉字尾演算法 遍歷中綴表示式中的數字和符號 對於數字 直接輸出 對於符號 左括號 進...

棧的應用 (中綴表示式 轉 字尾表示式)

中綴表示式 字尾表示式,都是用來呈現運算表示式的一種方式。標準表示式 4 5 6 7 中綴表示式,就是標準的表示式,即4 5 6 7 字尾表示式,符號在後的表示式,即4 5 6 7 中綴表示式轉字尾表示式的思想是 注意的是 只有 這5種符號才會入棧 1.讀到運算元時,立即輸出 2.讀到的是操作符,分...

棧的應用 中綴表示式轉字尾表示式

中綴轉字尾過程 1.對於數字 直接輸出 2.對於符號 2.1 左括號 進棧 2.2 運算符號 與棧頂符號進行優先順序比較,若棧頂符號優先順序低 此符號進棧 若棧頂符號優先順序不低 將棧頂符號彈出並輸出,之後進棧 若是乘除直接進棧 若是加減,與棧頂比較,若棧頂是乘除,直接輸出,否則進棧。2.3 右括號...