포스트 픽스/리버스 폴스 계산기를 쓰려고하는데, 각 숫자 앞에는 '#'이 붙습니다. 각 연산자 앞에 '!'가 붙습니다. , '.' 표현의 끝을 의미합니다. 각 숫자/문자/사이의 공백 하나. 나는 오류 검사에 신경 쓰지 않는다.포스트 픽스 계산기에서 세그멘테이션 폴트 받기
여기서 stringstream을 사용할 수 있다는 것을 알고 있지만, 여전히 여기에 stringstream을 사용할 수 있어야한다고 생각합니다.
입력
후 출력 22. 나는 현재 아래의 코드 세그먼트 오류를 얻고 것# 33 # 3 !/# 2 ! *.
, 같이 보일 것이다, 콘솔에 들어갔다.
감사합니다. 끝에
#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' 변수에 유효한 내용이 언제 있습니까? 문제를 파악하는 것이 도움이 될 것입니다. 그것이 쓰여지는 방식으로,'ch'가'!'이면'c'가 설정됩니다. 'else' 부분이'ch' 변수를 검사 할 것인가? –