1. 程式人生 > 其它 >洛谷P1449 字尾表示式

洛谷P1449 字尾表示式

題目連結:https://www.luogu.com.cn/problem/P1449

題目描述

所謂字尾表示式是指這樣的一個表示式:式中不再引用括號,運算子號放在兩個運算物件之後,所有計算按運算子號出現的順序,嚴格地由左而右新進行(不用考慮運算子的優先順序)。

如:3*(5–2)+7對應的字尾表示式為:3.5.2.-*7.+@。’@’為表示式的結束符號。‘.’為運算元的結束符號。

輸入格式

輸入:字尾表示式

輸出格式

輸出:表示式的值

輸入輸出樣例

輸入 3.5.2.-*7.+@ 輸出 16 

 

解題思路:

1棧 字尾表示式

2字尾表示式的計算方式非常簡單,遇到數字直接入棧,遇到運算子不入棧並將棧頂和棧頂下面一個兩個數字出棧,先出的數在運算子右邊,後出的在左邊,進行運算,將運算結果入棧,直到最後棧中只剩下最後一個數,輸出既是答案。

3'.'有什麼用,注意到並不是所有數都是一位數

將數字字元轉換成對應的數值的原理:

while(ch>='0'&&ch<='9'&&flag) /*判定為數字字元*/
{ d=10*d+ch-'0';

}

 ch-'0'是計算每個數字字元在數字中所對應的位置,較難理解的是10*d ,因為輸入的是多個數,每次計算完一個數字字元,依然處在迴圈中帶入下一次的計算,因此10*d的作用就是把上一次算得的結果往高位送,每乘以一個十就高一位。

 

參考程式碼:

 

 

#include <iostream>
#include<stack>
using namespace std;

int main()
{
stack<int> n;//棧  字尾表示式 是數字進棧 遇到運算子進行棧頂和次頂的運算
char c;
int ans,x,y;
while(c!='@')
{
c=getchar();
switch(c)
{
case '+':x=n.top();n.pop();y=n.top();n.pop();n.push(x+y);break;
case '-':x=n.top();n.pop();y=n.top();n.pop();n.push(y-x);break;
case '*':x=n.top();n.pop();y=n.top();n.pop();n.push(x*y);break;
case '/':x=n.top();n.pop();y=n.top();n.pop();n.push(y/x);break;
case '.':n.push(ans);ans=0;break;
default :ans=ans*10+c-'0';break;

//數字進zhan時 字元轉換為數zhi,由於有可能有多位數 多了一位,前面的乘以10 


}
}
cout<<n.top();
return 0;
}