本文主要是介绍数据结构-怀化学院期末题(58),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天发现了一个事情,学校平台可以交c++代码,那以后都用c++。但是不可以使用迭代器,否则会出现编译错误!!!
题目描述:
小学求算式问题。要求采用栈实现。
输入:
输入第一行为用例个数n。
接下来n个表达式。输出:
对每一个用例的表达式,输出其结果。
输入样例:
3
2+5
4+2*3-10/5
3*7-2
输出样例:
7
8
19
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
using namespace std;
typedef pair<int,int> PII;
const int N = 1e5 + 10;
struct node{double num; //操作数char op; //操作符bool flag; //true->操作数,false->操作符
};
string str;
stack<node> s; //操作符栈
queue<node> q; //后缀表达式序列
map<char,int> op;
void Change(){double num;node temp;for(int i = 0;i < str.length();){if(str[i] >= '0' && str[i] <= '9'){ //如果是数字temp.flag = true; //标记是数字数temp.num = str[i++] - '0';while(i < str.length() && str[i]>='0' && str[i]<='9'){temp.num = temp.num * 10 + (str[i] - '0');i ++;}q.push(temp);}else{ //如果是操作符temp.flag = false;while(!s.empty() && op[str[i]] <= op[s.top().op]){q.push(s.top());s.pop();}temp.op = str[i];s.push(temp);i ++;}}while(!s.empty()){q.push(s.top());s.pop(); }
}
double Cal(){double temp1,temp2;node cur,temp;while(!q.empty()){cur = q.front();q.pop();if(cur.flag == true) s.push(cur);else{temp2 = s.top().num;s.pop();temp1 = s.top().num;s.pop();temp.flag = true;if(cur.op == '+') temp.num = temp1 + temp2;else if(cur.op == '-') temp.num = temp1 - temp2;else if(cur.op == '*') temp.num = temp1 * temp2;else temp.num = temp1 / temp2;s.push(temp);}}return s.top().num;
}
int main(){op['+'] = op['-'] = 1;op['/'] = op['*'] = 2;int rrrr;cin >> rrrr;getchar();int num = 0;while(getline(cin,str),str != "0"){while(!s.empty()) s.pop();//初始化栈Change(); //中缀表达式转后缀表达式printf("%.d\n",int(Cal())); //计算后缀表达式num ++;if(num == rrrr) return 0;}return 0;
}
这篇关于数据结构-怀化学院期末题(58)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!