OJ 表示式求值(加減乘除和括號)簡化版

2021-09-27 04:28:27 字數 2143 閱讀 3028

刷oj題的總結,也作為《資料結構》重新學習的筆記,用到了c++的標準庫,因此可以簡化一些操作。

對簡單的算術表示式求值。運算子包括+,-,*,/,(,),#。參加運算的數均為整數。

特別說明:

1)實驗課請按照資料結構(c語言版)p53頁演算法3.4直接進行改編。

2)要實現演算法3.4,還需要編寫的函式如下:初始化棧函式--initstack()函式,入棧函式--push()函式,取棧頂元素函式--gettop()函式,運算子判斷函式--in()函式,運算子優先順序判斷函式--precede()函式,出棧函式--pop()函式,運算操作函式--operate()函式。

每行輸入乙個簡單的算術表示式,如輸入表示式:3*(7-2)

與輸入相對應,逐行輸出表示式對應的運算結果。如上面輸入表示式的運算結果為:15

3*(7-2)

4+2*3-10/5

15

8

思路介紹:

每次讀str[i]字元的時候,分為兩類:運算子和資料符。如果是運算子則儲存到棧中(如果滿足優先順序條件,則進行運算,把結果存入棧中);如果是資料符暫時存在乙個字串中,等待多個連續數字讀完了,再合併成乙個整數寫入棧中。

簡化說明:

完全參考《資料結構c語言版》(嚴蔚敏 李冬梅 吳偉民編著 人民郵電出版社)

使用c++標準庫中的stack,從而省略了自己編寫stack。

這些**是實際oj題,提交到oj網已經通過的**。

#include

#include

#include

using namespace std;

/** * 判斷優先順序

*/char

precede

(char ch1,

char ch2)

if(ch1 ==

')')

return

'>';if

(ch1 ==

'(')

if(ch2 ==

'(')

return

'<';if

(ch2 ==

')')

return

'>';if

(ch1 ==

'+'|| ch1 ==

'-')

return

'>';}

/** * 進行簡單二元運算

*/double

calc

(double num1,

double num2,

char calc)

return result;

}// written by smileyan

intmain()

str[i]

='#'

; str[i+1]

='\0'

;// 棧底寫入#作為結束符

optr.

push

('#');

i=0;

// 用來儲存數字

string data;

while

(str[i]

!='#'

|| optr.

top()!=

'#')

// 當當前字元不是數字的時候,則需要把之前的數字進行合成

int num =

atoi

(data.

c_str()

);// num==0表示data為空

if(num!=

0) opnd.

push

(num)

;// 清空data

data.

clear()

;// 判斷優先順序,進行入棧出棧操作

switch

(precede

(optr.

top(

), str[i]))

} cout

)<}return0;

}

因為自己基礎不紮實,學習這個花了不少時間。繼續刷題吧。

smileyan

2023年9月17日

表示式求值(OJ)

給定乙個字串描述的算術表示式,計算出結果值。輸入字串長度不超過100,合法的字元包括 0 9 字串內容的合法性及表示式語法的合法性由做題者檢查。本題目只涉及整型計算。功能 對輸入的字串表示式進行求值計算,並輸出結果。輸入 string inputstring 表示式字串 返回 int 正常返回tru...

OJ 中綴表示式求值

字尾表示式複習 題目內容 通過把 中綴轉字尾 和 字尾求值 兩個演算法功能整合在一起 非簡單的順序呼叫 實現對中綴表示式直接求值,新演算法還是從左到右掃瞄中綴表示式,但同時使用兩個棧,乙個暫存操作符,乙個暫存運算元,來進行求值。支援 五種運算 輸入格式 共1行,為1個字串,即乙個中綴表示式,其中每個...

華為oj中級 表示式求值

描述 給定乙個字串描述的算術表示式,計算出結果值。輸入字串長度不超過100,合法的字元包括 0 9 字串內容的合法性及表示式語法的合法性由做題者檢查。本題目只涉及整型計算。功能 對輸入的字串表示式進行求值計算,並輸出結果。輸入 string inputstring 表示式字串 返回 int 正常返回...