我正在尝试编写一个后修复/反向抛光计算器,只有在每个数字之前,每个操作符之前会有一个'#','!'和'''。表示结束表达。每个数字/字符/等之间有一个空格。我不关心错误检查。
我知道你可以在这里使用stringstream,但我仍然认为没有它就可以工作。
输入控制台的输入看起来像是
# 33 # 3 ! / # 2 ! *.
然后输出22.我目前正在使用以下代码获得分段错误。
感谢您的光临。
#include <iostream>
#include <cstdlib>
#include <math.h>
using namespace std;
class Stack{
public:
Stack(){
this->size = 0;
}
Stack & push(double c){
if (size == MAX_SIZE) die("Push Overflow");
data[size] = c;
size++;
return *this;
}
double pop(){
return data[--size];
}
double top() const{
return data[size-1];
}
unsigned getSize() const{return size;}
bool die(const string & msg){
cerr << "Fatal Error: " << msg << endl;
exit(EXIT_FAILURE);
}
void show(){
for (int i = 0; i < size; i++){
cout << data[i] << endl;
}}
private:
static const unsigned MAX_SIZE = 50;
double data[MAX_SIZE];
unsigned size;
};
int main(){
Stack s1;
bool inputComplete = false;
double num1 =0;
double num2 = 0;
double answer = 0;
char c, ch;
while(!inputComplete){
cin >> ch;
if (ch == '!'){
cin >> c;
num1 = s1.pop();
num2 = s1.pop();
switch(c){
case '+':
answer = num2 + num1;
break;
case '-':
answer = num2 - num1;
break;
case '/':
answer = num2/num1;
break;
case '^':
answer = pow(num2, num1);
break;
case '*':
answer = num2 * num1;
break;
}
s1.push(answer);
}
else if (c == '#'){
double number;
cin >> number;
s1.push(number);
}
else if (c == '.'){
inputComplete == true;
}
}
s1.show();
return 0;
}
答案 0 :(得分:2)
我发现的问题:
该行
else if (c == '#'){
应该是
else if (ch == '#'){
该行
else if (c == '.'){
应该是
else if (ch == '.'){
该行
inputComplete == true;
应该是
inputComplete = true;
<强>更新强>
我意识到您不需要任何错误检查代码。但是最少量的错误检查很有用。为此,我认为你应该检查何时达到EOF。
ch = cin.get();
if ( ch == EOF )
{
inputComplete = true;
}
else if (ch == '!'){
而不是
cin >> ch;
if (ch == '!'){
对我有意义。
答案 1 :(得分:1)
最后有
else if (c == '.'){
inputComplete == true;
}
但它应该是
else if (c == '.'){
inputComplete = true;
}