解题思路:
利用简单的栈操作将中缀表达式转换为后缀表达式,再利用后缀表达式求出值
要求的判定Yes,No是在处理单个字符串后得到的后缀表达式经判断结果直接给出
测试结果:
#include<iostream>
#include<stdlib.h>
#include<vector>
#include<string>
using namespace std;
#define TAL 100
/*
后缀表达式求值
*/
int HouZhuiRes(string target) {
string::iterator targB;
int num[TAL];
int top = -1;
for (targB = begin(target); targB != end(target); ++targB) {
if (*targB >= '0'&&*targB <= '9') {//数字入栈
num[++top] = *targB - '0';
}
else {//符号运算
int n = num[top--];
int m = num[top--];
switch (*targB) {
case '+':
num[++top] = m + n;
break;
case '-':
num[++top] = m - n;
break;
case 'x':
num[++top] = m * n;
break;
case '/':
num[++top] = m / n;
break;
}
}
}
return num[top];
}
/*
生成后缀表达式
*/
void ConstructHouZhui(vector<string> src) {
string targ;//targ存储后缀表达式
char op[TAL];//模拟操作符的栈
int top = -1;//初始化栈顶
/*
假定+ - 的优先级1,* /优先级为2
当扫描到+或-时op入栈一个1,为*或/时入栈一个2
*/
//扫描src
string::iterator BegA;
for (string str : src) {
for (BegA = begin(str); BegA != end(str); ++BegA) {
if (*BegA >= '0'&&*BegA <= '9')//若为数字直接加入后缀表达式
targ += *BegA;
else {//否则处理运算符
if (*BegA == '+' || *BegA == '-') {
if (-1 == top) {
op[++top] = *BegA;
}
else {
if (op[top] == '+' || op[top] == '-') {//小于等于出栈
while (top > -1 && (op[top] == '+' || op[top] == '-')) {
targ += op[top--];//栈顶元素出栈
}
op[++top] = *BegA;
}
}
}
if (*BegA == 'x' || *BegA == '/') {
if (-1 == top) {
op[++top] = *BegA;
}
else {
if (op[top] == '+' || op[top] == '-') {//大于入栈
op[++top] = *BegA;
}
else {//情况为栈顶为*或/为同优先级出栈
while (top > -1 && (op[top] == 'x' || op[top] == '/')) {
targ += op[top--];//栈顶元素出栈
}
op[++top] = *BegA;
}
}
}
}
}
while (top > -1) {
targ += op[top--];
}
if (24 == HouZhuiRes(targ)) {
cout << "Yes"<<endl;
}
else {
cout << "No"<<endl;
}
}
}
int main(void) {
/*
利用后缀表达式求值,简单模拟 中缀->后缀 运算符大于入栈,小于等于出栈
*/
int num;//表达式个数
vector<string> src;//中缀表达式
int i;
/*
输入处理串
*/
cout << "输入字符串个数" << endl;
cin >> num;
for (i = 0; i < num;++i) {
char str[TAL];
cin >> str;
//getline(cin, temp);//对于cin输入string
src.push_back(string{str});
}
/*
targ中存储着后缀表达式
*/
ConstructHouZhui(src);
system("pause");
return 0;
}
存在问题:
1,考试系统依旧编译出错,但自己的vs2017完全没问题
2,输入字符串时使用getline(cin,目标)会出现错误