棧的一些功能函式,這邊用到的是鏈式棧。
typedef char elemtype;
//結點的資訊
struct node
;typedef struct node node;
//棧的資訊
struct stack
;typedef struct stack stack;
首先定義兩個棧,乙個叫s_num用來存放運算元,另乙個叫s_opt用來存放操作符。//初始化
int stackinit(stack **s)
//初始化只要分配棧資訊結構體的空間,結點的空間等到進棧的時候再分配。
//進棧:
int push(stack **s, elemtype e)
//出棧:
int pop(stack **s)
再定義乙個字元陣列用來存放輸入的表示式,初始化為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 右括號...