九度OJ 1101 計算表示式

2021-06-29 08:59:53 字數 1690 閱讀 8643

題目描述:

對於乙個不存在括號的表示式進行計算

輸入:

存在多種資料,每組資料一行,表示式不存在空格

輸出:

輸出結果

樣例輸入:

6/2+3+3*4

樣例輸出:

18這個題目一行輸入可能有多個表示式

方法1:

#include 

#include

using

namespace

std;

char str[220]; //儲存表示式字串

/*優先順序矩陣,記人為新增在表示式首位的標記運算子為0號,

+為1號,-為2號,*為3號,/為4號,若mat[i][j]==1

則表示i號運算子優先順序大於j號。

*/int mat[5]=;

stack

op; //運算子棧

stack

in;//數字棧

/*獲得表示式中下乙個元素的函式,若函式結束執行時,引用變數reto為true,則表示該元素

為乙個運算子,其編號儲存在飲用變數retn中;否則,表示該元素為乙個數字,其值儲存在

引用變數retn中,引用變數i表示遍歷到的字串的下標。

*/void getop(bool &reto,int &retn,int &i)

if (str[i]==0)//字串掃瞄結束時,將0號運算子壓棧

if (str[i]>='0'&&str[i]<='9')//當為數字時,將reto置為false

elseelse

if (str[i]=='-')

else

if (str[i]=='*')

else

if (str[i]=='/')

i++;

return;

}retn=0;

for (; str[i] !='+'&&str[i] !='-'&&str[i] !='*'&&str[i] !='/'&&str[i]!=0; ++i)

return ;

}int main()elseelse

else

if(ret ==2) tmp=a-b;

else

if(ret ==3) tmp=a*b;

else tmp=a/b;

in.push(tmp);

}op.push(retnum);}}

if (op.size()==2&&op.top()==0)

}printf("%d\n",in.top());

}return

0;}

方法2:利用陣列來做

#include 

/*這種思路是從左至右掃瞄表示式:將加數 減數 乘式的結果 除式的結果一次儲存在

陣列中,最後將陣列求和。

*/int a[100];

int k;

char op;

int i;

int main()else

if(op=='-')else

if(op=='*')else

a[i]/=k;

}for (int k = 1; k <=i ; ++k)

a[0]+=a[k];

printf("%d\n",a[0]);

}}

九度OJ 1101 計算表示式

題目描述 對於乙個不存在括號的表示式進行計算 輸入 存在多種資料,每組資料一行,表示式不存在空格 輸出 輸出結果 樣例輸入 6 2 3 3 4 樣例輸出 18 這道題給的條件明顯不足。有以下不足 沒有交代運算子種類 運算元什麼型別也沒說 正負數也沒交代。但我還是硬著頭皮做了。還是用棧來做。數字棧 操...

九度1101 計算表示式

題目描述 對於乙個不存在括號的表示式進行計算 輸入 存在多種資料,每組資料一行,表示式不存在空格 輸出 輸出結果 樣例輸入 6 2 3 3 4 樣例輸出 18 過不去。一直wawawawawawawa include include include include include include i...

九度 1101 字串處理 計算表示式

根據我的通過來看,首先這道題裡面沒有小數,如果存在除不盡的情況,也是按取整來算。本題建立了兩個棧,乙個儲存數字的數字棧,乙個儲存加減乘除的符號棧。在處理字串的時候,每次找到乙個數字時,放進乙個string的臨時變數裡,因為會存在十位以上的情況 每次找到乙個符號時,首先將string變數轉int放入數...