題目描述:
對於乙個不存在括號的表示式進行計算
輸入:
存在多種資料,每組資料一行,表示式不存在空格
輸出:
輸出結果
樣例輸入:
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放入數...