刷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;
}
因為自己基礎不紮實,學習這個花了不少時間。繼續刷題吧。
smileyan2023年9月17日
表示式求值(OJ)
給定乙個字串描述的算術表示式,計算出結果值。輸入字串長度不超過100,合法的字元包括 0 9 字串內容的合法性及表示式語法的合法性由做題者檢查。本題目只涉及整型計算。功能 對輸入的字串表示式進行求值計算,並輸出結果。輸入 string inputstring 表示式字串 返回 int 正常返回tru...
OJ 中綴表示式求值
字尾表示式複習 題目內容 通過把 中綴轉字尾 和 字尾求值 兩個演算法功能整合在一起 非簡單的順序呼叫 實現對中綴表示式直接求值,新演算法還是從左到右掃瞄中綴表示式,但同時使用兩個棧,乙個暫存操作符,乙個暫存運算元,來進行求值。支援 五種運算 輸入格式 共1行,為1個字串,即乙個中綴表示式,其中每個...
華為oj中級 表示式求值
描述 給定乙個字串描述的算術表示式,計算出結果值。輸入字串長度不超過100,合法的字元包括 0 9 字串內容的合法性及表示式語法的合法性由做題者檢查。本題目只涉及整型計算。功能 對輸入的字串表示式進行求值計算,並輸出結果。輸入 string inputstring 表示式字串 返回 int 正常返回...