この質問は算術で、我々はそれを解決するためにスタックを使用します
テンプレートクラスのスタックC ++を使用します
#include <スタック> // ヘッダ スタック < INT > NUM; // スタックint型の定義 num.pushを(); // スタックのスタック要素に num.pop(); //は、スタックを削除上の要素 num.topは(); // スタックの要素を返し、除去しない num.emptyを(); // リターンスタックが空である num.size(); // スタックの要素の現在の数を返します
1.文字が数字で、スタックにNUM
文字は「+」である場合には2、記号がスタックに格納されます
3文字が「 - 」、なぜなら追加の数の反対に等しい減少した数の、次の文字が格納されているようにNUMスタックをネゲート、スタックストアは「+」記号
4.文字が「X」がある場合は、現在の文字は次の文字qとP、Qの* Pの預金NUMを取ります
5.文字は「/」、次の文字qとP、Qを取るために、現在の文字/ P店numがある場合には
コード:
#include<cstdio> #include<cstring> #include<stack> using namespace std; int n; char str[10]; stack<int> num; stack<char> sign; int main() { scanf("%d",&n); getchar(); while(!num.empty()) num.pop(); while(!sign.empty()) sign.pop(); for(int i=0;i<n;i++) { gets(str); int j=0; while(j<strlen(str)) { if(str[j]>'0'&&str[j]<='9') { num.push(str[j]-'0'); } else if(str[j]=='+') { sign.push('+'); } else if(str[j]=='-') { j++; num.push((-1)*(str[j]-'0')); sign.push('+'); } else if(str[j]=='x') { int q=num.top(); num.pop(); j++; int p=str[j]-'0'; num.push(q*p); } else if(str[j]=='/') { int q=num.top(); num.pop(); j++; int p=str[j]-'0'; num.push(q/p); } j++; } while(!sign.empty()) { int q=num.top(); num.pop(); int p=num.top(); num.pop(); sign.pop(); num.push(q+p); } //printf("%d\n",num.top()); if(num.top()==24) printf("Yes\n"); else printf("No\n"); } return 0; }