總結對於乙個表示式(例如:(5-2)*3)的問題,需要考慮到字元之間的優先順序,對於上述問題的求解有很多種,例如,變更為字尾表示式:52-3×;字首表示式等。
本文採用最為簡單的求解方案
問題式樣:2×(2+6/3)-2+1
從左向右將表示式字元乙個個讀入棧中,數字放入數字棧(opnd),字元放入符號棧(optr)
先在optr中存入『#』
再存入第乙個字元『2』,為數字,壓入opnd
下乙個字元『×』(『*』)
壓入入符號棧的原則是,待存入字元的優先順序比棧頂高,進行壓棧操作;如果待存入字元的優先順序比棧頂低,將棧頂字元取出,再從數字棧中取頭兩個數字進行相應的運算,計算結果壓入數字棧中,再將一開始帶存入字元與字元棧棧頂的元素進行優先順序的比較…
頂欄表示待壓入字元,左欄表示棧頂字元
』>『表示,待壓入字元優先順序小;』
字元『*』的優先順序比『#『高,壓入optr
下乙個字元』(『比』*『的優先順序高,壓入optr
'2』壓入opnd
下乙個字元『+』,優先順序高,壓入optr
數字6,壓入opnd
『/』,壓入optr
數字3,壓入opnd
字元『)』,優先順序低
將opnd的頭兩個數字(3和6)取出,和optr棧頂元素(』/『)進行運算
6/3=2
將運算結果壓入opnd
再將『)』,與『+』進行比較,優先順序低,重複
再將『(』,與『)』進行比較,優先順序相等,『)』出棧
『-』的優先順序比『*』低,重複
再將『-』與『#』進行比較,優先順序高,壓入optr
數字2壓入opnd
'+'優先順序比『-』低
『+』優先順序比『#』高,壓棧optr
數字1,壓棧opnd
最後乙個字元『#』,優先順序低
『#』與『#』優先順序相等,出棧
無字元,結果從opnd出棧,為5
**如下(示例):
struct stack* optr =
null
;struct stack* opnd =
null
; optr=
creatstack()
;push_stack_node
(optr,
'#')
; opnd=
creatstack()
;char ch =0;
ch =
getchar()
; stack_data_type theta =0;
stack_data_type a =0;
stack_data_type b =0;
while
(ch !=
'#'||
get_top
(optr)
!='#'
)else
switch
(precede
(get_top
(optr)
, ch,optr))}
stack_print
(*opnd)
;
**如下(示例):
intin(
char ch)
;int i =0;
for(i =
0; i <
sizeof
(arr)
; i++
)return0;
}
char
precede
(stack_data_type t1, stack_data_type t2,
struct stack* optr)
return f;
}
int
operate
(stack_data_type a, stack_data_type theta, stack_data_type b)
}
對於乙個表示式求值,從左至右將字元取出,如果是數字,放入數字棧中,如果是符號,放入符號棧中;
放入符號棧中有一定的原則,優先順序高的壓棧,優先順序低的,從符號棧**棧乙個符號,再從數字棧**棧兩個數字,進行相應的運算,再將結果壓入數字棧中;
最終得到乙個空的符號棧和乙個只有乙個數的數字棧,
將數字棧的最後乙個數字出棧,即為所求結果。
表示式求值問題
這是清華大學鄧俊輝資料結構 c 中的乙個案例,通過使用棧這種資料結構,完成了較為複雜的表示式求值問題,以下 是我整理改編而成,能夠完成加減乘除,乘方 階乘的運算,以及括號的處理。在這裡,我使用到了c stl 中的容器stack。include include include include incl...
表示式求值問題之表示式樹
include include include include define m 1005 define clr arr,now memset arr,now,sizeof arr using namespace std stackshu typedef struct node tire,t cha...
表示式求值的問題
include include include define false 0 define true 1 define error 0 define ok 1 define overflow 1 typedef int status stack typedef char selemtype defi...