后缀表达式救命
本帖最后由 ExiaGN001 于 2022-7-1 21:42 编辑C++语言
输入
输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。
输出
输出为一行,表达式的值。
输入样例
11.0 12.0 + 24.0 35.0 + *
输出样例
1357.000000
像这种该怎么写程序?
告诉我读入数据并处理的部分就行
谢谢大家 #include <iostream>
#include <cctype>
#include <stack>
using std::cin, std::cout, std::cerr, std::endl;
using std::stack;
#define NUM 256
struct token_t {
int symbol;
double value;
};
token_t get_token() {
int ch = cin.get();
switch(ch) {
case ' ':
case '\t':
case '\v':
case '\f': return get_token();
}
if(isdigit(ch)) {
cin.unget();
double value; cin >> value;
return {.symbol = NUM, .value = value};
}
return {.symbol = ch};
}
int main() {
cout.setf(cout.fixed);
token_t token;
stack<double> s;
while(true) {
token = get_token();
if(token.symbol == '\n') {
cout << s.top() << endl;
s.pop();
break;
}
if(token.symbol == NUM) {
s.push(token.value);
continue;
}
switch(token.symbol) {
case '+': {
double b = s.top(); s.pop();
double a = s.top(); s.pop();
s.push(a + b);
break;
}
case '-': {
double b = s.top(); s.pop();
double a = s.top(); s.pop();
s.push(a - b);
break;
}
case '*': {
double b = s.top(); s.pop();
double a = s.top(); s.pop();
s.push(a * b);
break;
}
case '/': {
double b = s.top(); s.pop();
double a = s.top(); s.pop();
s.push(a / b);
break;
}
default:
cerr << "无法识别运算符:'" << (char)token.symbol << "'" << endl;
}
}
return 0;
}
改成这样吧
#include <iostream>
#include <cctype>
#include <stack>
using std::cin, std::cout, std::cerr, std::endl;
using std::stack;
#define NUM 256
struct token_t {
int symbol;
double value;
};
token_t get_token() {
int ch = cin.get();
switch(ch) {
case ' ':
case '\t':
case '\v':
case '\f': return get_token();
}
if(isdigit(ch)) {
cin.unget();
double value; cin >> value;
return {.symbol = NUM, .value = value};
}
return {.symbol = ch};
}
int main() {
cout.setf(cout.fixed);
token_t token;
stack<double> s;
while(true) {
token = get_token();
if(token.symbol == '\n') {
cout << s.top() << endl;
s.pop();
break;
}
if(token.symbol == NUM) {
s.push(token.value);
continue;
}
double b = s.top(); s.pop();
double a = s.top(); s.pop();
switch(token.symbol) {
case '+': s.push(a + b); break;
case '-': s.push(a - b); break;
case '*': s.push(a * b); break;
case '/': s.push(a / b); break;
default: cerr << "无法识别运算符:'" << (char)token.symbol << "'" << endl;
}
}
return 0;
}
页:
[1]