題外話----自己孤陋寡聞,不知道c++有棧函式。無賴寫了兩個型別的棧函式,函式寫好了,可是對於表示式中的整數,一位還好處理,可是上了兩位的我就不知道該怎樣轉換成整型了忘了atoi函式,浪費了好多時間(自己太渣了)。最後看了的部落格豁然開朗。只要熟悉棧,知道atoi函式,這題處理起來就沒什麼問題.
**題目**
問題描述
輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。
輸入格式
輸入一行,包含乙個表示式。
輸出格式
輸出這個表示式的值。
樣例輸入
1-2+3*(4-5)
樣例輸出
-4資料規模和約定
表示式長度不超過100,表示式運算合法且運。過程都在int內進行。
注釋應該寫的很清楚了,看著應該沒什麼大問題,如果對switch函式體裡面為什麼要先進行函式呼叫再進行符號入棧操作,自己可以在編譯器上除錯。就明白了。
主函式開頭,stack_ch.push('(')這步操作為什麼需要?
前面說main函式裡面switch是先呼叫函式在入棧。在aas和mad函式中,有乙個while迴圈,迴圈就得有條件。條件是有stack_ch棧彈出乙個元素給的。如果剛開始不入乙個『(』會造成空棧,程式異常退出。
#include#include#include#includeusing namespace std;
stackstack_ch;//構造字元棧
stackstack_in;//構造數字棧
char str[5000];//輸入的表示式,長度定義足夠長
void aas()
stack_ch.pop();//彈出操作符號
stack_in.push(num2);//將新值壓入整型棧中 }}
void mad()
stack_ch.pop();//刪除操作符
stack_in.push(num2);
} }int main(void)
number[k]='\0';
if(number[0]!='\0')
k=0;
switch(str[i])
}printf("%d\n",stack_in.top());//輸出棧頂元素
return 0;
}
演算法訓練 表示式計算
上網查了一下,採用字尾表示式 從中序表示式 轉換為 後序表示式 由於後續表示式更易計算機去解決,所以我們在運算算術表示式時要先轉換為後序的。方法如下 建立符號棧 順序掃瞄中序表示式 a 是數字,直接輸出 b 是運算子 i 直接入棧 ii 將符號棧中的元素依次出棧並輸出,直到 只出棧,不輸出 iii ...
演算法訓練 表示式計算
演算法訓練 表示式計算 時間限制 1.0s 記憶體限制 256.0mb 問題描述 輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含乙個表示式。輸出格式 輸出這個表示式的值。樣例輸入 1 2 3 4 5 樣例輸出 4 資料規模和約定 表示式長度不超過10...
演算法訓練 表示式計算
問題描述 輸入乙個只包含加減乖除和括號的合法表示式,求表示式的值。其中除表示整除。輸入格式 輸入一行,包含乙個表示式。輸出格式 輸出這個表示式的值。樣例輸入 1 2 3 4 5 樣例輸出 4 資料規模和約定 表示式長度不超過100,表示式運算合法且運算過程都在int內進行。問題分析 利用雙棧乙個儲存...