棧的基本操作:
優先順序函式(precede)
求值函式(operate)
判斷操作符函式(in)
表示式求值函式(evaluateexpression)
其他:操作符棧(optr),運算元棧(opnd)
請輸入表示式:3*
(5—2
)
第一種輸入方式是直接打出表示式進行整體輸入,而第二種則是以乙個乙個的方式讀入,第一種輸入方式可以直接建立乙個陣列char str[ ]然後用gets(str)進行輸入,表示式輸入非常直觀。如果是第二種輸入方式則是通過getchar()進行一位位的讀取,表示式輸入不如第一種直觀方便。
表示式的輸入必須以「=」結束
輸入示例:3*(5-2)=
輸入格式可以有空格,但是唯一的bug是在多位數的每一位之間加空格會出錯!
isdigit是包含在標頭檔案ctype.h中的判斷是否為數字的函式,是數字返回1,不是返回0。
此演算法用於計算整型,若要計算浮點數,把相應的型別更換成double即可實現。
演算法運算邏輯是先以字元型讀入字元陣列中,再將字元型轉換為整型存入數字棧中。
#include
#include
#include
#define maxsize 100
typedef
int datatype;
typedef
struct stack
sqstack;
void
create
(sqstack *s)
s->top=s->base;
s->stacksize=maxsize;
return;}
intpush_in
(sqstack *s,datatype value)
*s->top=value;
//"*s->top++=value;"
s->top++
;return;}
intpop_out
(sqstack *s,datatype *elem)
s->top--
;*elem=
*s->top;
//"*elem=*--s->top;"
return;}
datatype gettop
(sqstack *s)
return
*(s->top-1)
;}char
precede
(char theta1,
char theta2),,
,,,,
};switch
(theta1)
switch
(theta2)
return
(pre[i]
[j]);}
intoperate
(int a,
char theta,
int b)}}
intin
(char c)
//判斷是否為運算子,是運算子返回1,若不是返回0
}int
evaluateexpression
(char exp)
}elseif(
isdigit
(ch)
)//判斷是否為數字
}else
if(ch==
' ')
//判斷是否為空格
}else
//若不是上述三種情況之一,則為非法字元
}return
(gettop
(&opnd));
//最後返回運算元棧頂為運算結果
資料結構(c語言第二版)——嚴蔚敏
棧的經典應用——yuluows
棧的應用(表示式求值)——sup_klz
順序棧實現表示式求值(C語言實現) 棧
表示式求值一定會出現表示式中運算子的優先順序問題。運算規則 先乘除,後加減 從左算到右 先括號內,後括號外 運算子優先表 上面 中有一些比較特殊的位置 相等 左括號遇到右括號相等說明左右括號匹配。和 遇到的時候也是 我們在表示式的左邊人為的加上乙個 在表示式掃瞄完成之後再加上乙個 表示表示式掃瞄完了...
表示式求值 棧 用C 實現
1 include 2 3 include 4 5 include 6 7 include 8 9 include 10 11using namespace std 1213 1415 char precede char a,char b 2223 2425 2627 2829 3031 3233 ...
棧實現表示式求值(C
為了實現用棧計算算數表示式的值,需設定兩個工作棧 用於儲存運算子的棧opter,以及用於儲存運算元及中間結果的棧opval。演算法基本思想如下 1 首先將運算元棧opval設為空棧,而將 作為運算子棧opter的棧底元素,這樣的目的是判斷表示式是否求值完畢。2 依次讀入表示式的每個字元,表示式須以 ...