【发布时间】:2014-07-06 03:10:07
【问题描述】:
我正在尝试编写一个后修复/反向抛光计算器,只是在每个数字之前,会有一个“#”,在每个运算符之前,一个“!”和一个“。”表示表达式的结束。每个数字/字符/等之间有一个空格。我不关心错误检查。
我知道你可以在这里使用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;
}
【问题讨论】:
-
首先,我会在函数
pop中添加if (size == 0) die("Pop Underflow");。 -
只有波兰人才能编写波兰计算器的实现。
-
真正退出循环,
c变量什么时候有有效内容?确定这将有助于隔离问题。它的编写方式是,c仅在ch是!时才被设置。else if部分是否用于检查ch变量?
标签: c++ calculator