算術表示式求值 棧的應用

2021-08-01 04:58:50 字數 2517 閱讀 2394

注:實驗用書為 資料結構 c語言版 第2版,人民郵電出版社出版。

實驗題目:學生管理系統的設計與實現

實驗環境:visual c++ 6.0或其他c++環境

一、實驗目的

1、掌握棧的定義及實現;

2、掌握利用棧求解算術表示式的方法。

二、實驗內容

通過修改完善教材中的演算法3.4,利用棧來實現算術表示式求值的演算法。對演算法3.4中呼叫的幾個函式要給出其實現過程:

1、函式in(c):判斷c是否為運算子;

2、函式precede(t1,t2):判斷運算子t1和t2的優先順序;

3、函式operate(a,theta,b):對a和b進行二元運算theta。

4、程式執行時,輸入合法的算術表示式(中間值及最終結果要在0~9之間,可以包括加減乘除和括號),便可輸出相應的計算結果。如下圖所示。

三、實驗吐槽

此**有很多缺陷,比如只能整數運算。而且單個運算最多到127。即數字執行結果最好在100以內。但可以實現10*10#等運算,這是因為演算法的儲存環境是char,最大256,而『0』這個ascii值又是48,對運算有所限制,但突破了之前的只能一位數字運算。

四、**

**主檔案(calculator.cpp):

#include

#include "stack.h"

#include

using

namespace

std;

bool in(char e)//判斷讀入字元是否為運算子

char precede(char a,char b)//比較運算子的優先順序

else

if(a=='*'||a=='/')

else

if(a=='(')

else

if(a==')')

else

if(a=='#')

return f;

}int operate(int i,char theta,int j)//計算a(theta)b結果

return result;

}int read_c(int *n)

dowhile(!in(c)); //如果下乙個字元是數字,進入下一輪迴圈

ungetc(c,stdin);//新讀入的字元不是數字,可能是運算子,為了不影響下次讀入,把該字元放回到輸入緩衝區

return0;}

int evaluateexpression()

else}}

return gettop(opnd);

}int main()

**標頭檔案(stack.h):

#ifndef stack_h_included

#define stack_h_included

#endif // stack_h_included

#define maxsize 100

#include

using namespace std;

typedef char selemtype;

typedef struct

sqstack;

void initstack(sqstack &s)

bool push(sqstack &s,char e)

bool pop(sqstack &s,char &e)

char gettop(sqstack s)

另外提供一種我第一次實踐的方法,這裡的算數表示式只能計算1位數值。

#include

#include "stack.h"

#include

using

namespace

std;

bool in(char e)//判斷讀入字元是否為運算子

char precede(char a,char b)//比較運算子的優先順序

else

if(a=='*'||a=='/')

else

if(a=='(')

else

if(a==')')

else

if(a=='#')

return f;

}char operate(char a,char theta,char b)//計算a(theta)b結果

int evaluateexpression()

else}}

return gettop(opnd)-'0';

}int main()

五、流程圖

棧的應用 算術表示式求值

選擇棧作為資料結構,所以所有操作都要圍繞棧的特點來進行。因為先入棧而被壓在下面的意味著要後處理,所以優先順序低的不能壓著優先順序高的而入棧。對於同級的操作符,因為要按照從左往右的運算規則,所以也不 能壓著同級的操作符而入棧。簡單來說,與棧頂的操作符比較,優先順序高的則入棧,否則操作符出棧作相應運 算...

棧的應用 算術表示式求值

算術表示式中可以包含 這6個運算子,要計算的表示式以字串行的形式在程式執行時輸入。為了便於實現,規定 1 每個表示式均以字元 開始,以 號結束,例如,23 13 8 76 100 表示式中不能出現數字和運算子外的其它字元 空格也不行 2 表示式中的運算數只能是非負整數 3 輸入的表示式都是合法的。編...

棧的應用之算術表示式求值

1 2 3 4 此算術表示式由一些操作符和運算元組成。其中,操作符有 等,運算元有 1 2 3 等。對於操作符來說,其運算是有優先順序的。比如,上述表示式中,3 4應該先進行操作,將得到的結果再與2相乘。算符間的優先關係如下 運算子 根據算符間的優先關係表,使用兩個棧。乙個棧為optr,儲存運算子,...