不知道为啥这个会报错deque iterator not dereferencable
#include <iostream>
#include <algorithm>
#include<string>
#include<stack>
using namespace std;
char str[210];
int prio[5][5] = {
1, 0, 0, 0, 0,//0自定义
1, 0, 0, 0, 0,//1 "+"
1, 0, 0, 0, 0,//2 "-"
1, 1, 1, 0, 0,//3 “*”
1, 1, 1, 0, 0
};
stack<int>op; //村运算符编号
stack<double>num;//表达式数字
double cal(int t){
double a = num.top();
num.pop();
double b = num.top();
num.pop();
double ret;
switch (t)
{
case 1:ret = a + b; break;
case 2:ret = b - a; break;
case 3:ret = a * b; break;
case 4:ret = b / a; break;
}
return ret;
}
void main()
{
while (gets(str)){
if (str[0] = '0' && str[1] == 0)
return;
int i = 0;
int len = strlen(str);
int n = 0;//数字
int t = 0;
while (i < len){
n = 0;
while (str[i] == ' ')
i++;
while (str[i] >= '0'&&str[i]<='9'&&i < len)
{
n += n* 10 + str[i] - '0';
i++;
}
num.push(n);
while (str[i] == ' ')
i++;
if (str[i] == '+')
t = 1;
else if (str[i] == '-')
t = 2;
else if (str[i] == '*')
t = 3;
else if (str[i] == '/')
t = 4;
//优先级高于栈顶
if (prio[t][op.top()] == 1 || op.empty())
op.push(t);
else{
while (prio[t][op.top()] == 0)
{
int tmp = op.top();
op.pop();
num.push(cal(tmp));
}
op.push(t);
}
i++;
}
while (!op.empty())
{
int tmp = op.top();
op.pop();
num.push(cal(tmp));
}
cout.precision(2);
cout << fixed << num.top() << endl;
num.pop();
}
}
正确代码:
#include <iostream>
#include <algorithm>
#include<string>
#include<stack>
using namespace std;
char str[210];
stack<char>op; //运算fu
stack<double>num;//表达式数字
double cal(char t){
double a = num.top();
num.pop();
double b = num.top();
num.pop();
double ret;
switch (t)
{
case '+':ret = a + b; break;
case '-':ret = b - a; break;
case '*':ret = a * b; break;
case '/':ret = b/ a; break;
}
return ret;
}
void main()
{
int len,i;
char oper;
while (gets(str)){
len = strlen(str);
if (str[0] == '0' && str[1]==0)
return;
i = 0;
int n = 0;//数字
int t = 0;
while (i < len){
n = 0;
while (str[i] == ' ')
i++;
while (str[i] >= '0'&&str[i]<='9'&&i < len)
{
n = n* 10 + str[i] - '0';
i++;
}
num.push(n);
while (str[i] == ' ')
i++;
switch (str[i]){//处理操作符
case '+': case '-'://如果操作符为优先级最低的加减
while (!op.empty()){//比此操作符优先级高或者相等,此题中所有操作符都符合此条件,略去
oper = op.top();//弹出栈顶操作符
op.pop();
num.push(cal(oper));//将结果压入堆栈
}
op.push(str[i]);
break;
case '*': case '/'://如果操作符为优先级第一的乘除
//while (!op.empty() && (op.top() == '*' || op.top() == '/')){//比此操作符优先级高或者相等
// oper = op.top();//弹出栈顶操作符
// op.pop();
// num.push(cal(oper));//将结果压入堆栈
//}
op.push(str[i]);
break;
default:
break;
}
i++;
}
while (!op.empty())
{
int tmp = op.top();
op.pop();
num.push(cal(tmp));
}
printf("%.2lf\n", num.top());
/*cout.precision(2);
cout << fixed << num.top() << endl;*/
num.pop();
}
}