C語言 用棧實現表示式求值 順序棧

2021-10-05 03:34:37 字數 2013 閱讀 6685

棧的基本操作:

優先順序函式(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 依次讀入表示式的每個字元,表示式須以 ...