用C++编写一个程序,判断进栈的是运算符还是数字
时间: 2024-10-24 18:17:01 浏览: 22
在C++中,我们可以创建一个简单的表达式解析器来判断进栈的是运算符还是数字。这里我们假设使用了栈的数据结构,当遇到运算符时,我们将其压入栈,遇到数字时则检查栈顶是否为运算符,如果是,则需要执行运算,然后将数字压入栈;如果栈顶不是运算符,则直接将数字压入栈。以下是一个简单的示例:
```cpp
#include <iostream>
#include <stack>
#include <cctype>
bool isOperator(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/') && std::isalpha(c);
}
void processInput(const std::string& input, int& result, std::stack<char>& operatorsStack) {
for (char c : input) {
if (std::isdigit(c)) { // 如果是数字
result *= pow(10, input.size() - 1 - input.find(c)); // 乘以10的相应次幂
result += c - '0'; // 将数字转换为整数并加到结果上
} else if (isOperator(c)) { // 如果是运算符
while (!operatorsStack.empty() && isOperator(operatorsStack.top()) && precedence(c) <= precedence(operatorsStack.top())) {
// 当栈中有优先级更高的运算符时,先执行它们
char op = operatorsStack.top();
operatorsStack.pop();
result = performOperation(result, operatorsStack.top(), op); // 执行运算
}
operatorsStack.push(c); // 运算符压栈
} else { // 其他字符如空格忽略
continue;
}
}
// 最后处理栈中剩余的运算
while (!operatorsStack.empty()) {
char op = operatorsStack.top();
operatorsStack.pop();
result = performOperation(result, operatorsStack.top(), op);
}
}
int performOperation(int a, char op, char b) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b; // 注意除法运算可能有整数溢出问题
}
return a; // 默认情况,不做任何操作,返回a
}
int main() {
std::string expression;
std::cout << "请输入一个简单的表达式(只包含数字、+、-、*、/),并回车:";
getline(std::cin, expression);
int result = 0;
std::stack<char> operatorsStack;
processInput(expression, result, operatorsStack);
std::cout << "计算结果是: " << result << std::endl;
return 0;
}
```
在这个示例中,`processInput`函数负责处理输入,`isOperator`检查字符是否为运算符,`precedence`用于比较运算符的优先级(这里简化为直接使用运算符本身)。注意,这个例子仅适用于最简单的算术表达式,实际应用可能需要更复杂的解析规则。
阅读全文