有個有趣的小細節 int(數字字符+‘0’)轉化的是二進制,int(數字字符-‘0’)轉化的是十進制數,不知道小夥伴們發現沒有呢?
這是csp題目:
利用棧有個缺點就是隻能一個一個進去,也就是說表達式中的數字必須是個位數0-9不能是兩位數哦!
注意:入棧*的時候用小寫x代替哦!!
下面是我臨時寫的測試代碼有註釋 ^ - ^
#include<iostream>
#include<stdlib.h>
#include<stack>//調用棧
using namespace std;
string s[100];//全局變量長度100
int s_stack(string s,stack<int> &number){
for(int i=0;i<s.length();++i){//走一遍s
if(s[i]>='0'&&s[i]<='9')
{
number.push(s[i]-'0');//0-9字符轉換int壓入棧
}
else if(s[i]=='+'||s[i]=='-'){
(s[i]=='+') ? number.push(s[++i]-'0'):number.push(-(s[++i]-'0'));//不用計算,將下一個數定義爲正數或者負數,壓棧
}
else if(s[i]=='x'||s[i]=='/'){
if(s[i]=='x'){
int temp=number.top();//拿出棧頂數
number.pop();//刪除棧頂數
number.push(temp*(s[++i]-'0'));//和前一個數*再次進入棧
}
else{
int temp=number.top();//拿出棧頂數
number.pop();//刪除棧頂數
number.push(temp/(s[++i]-'0'));//和前一個數/再壓入棧
}
}
}
return number.size();
}//算術表達式的數值壓棧
int result(stack<int> &number){
int result=0;
while(!number.empty()){
result+=number.top();
number.pop();
}
if(result==24){
return 1;
}//24返回1,否則返回0
return 0;
}//累加棧元素
int main(){
system("color 3");
int n;
cin>>n;
for(int i=0;i<n;++i){
cin>>s[i];
}
for(int i=0;i<n;++i){
stack<int> number;//臨時的棧來存儲
s_stack(s[i],number);
result(number)? cout<<"Yes\n":cout<<"No\n";
}
return 0;
}
Ok沒問題很簡單!