C++ 栈 判断 四则表达式是否正确 包含括号、浮点数、负数
时间: 2023-12-29 10:05:10 浏览: 154
要判断一个包含括号、浮点数和负数的四则表达式是否正确,你可以使用栈和递归来实现。下面是一个基本的算法:
1. 创建一个空栈,用于存储左括号。
2. 遍历表达式,逐个读取字符。
3. 如果字符是左括号,将其压入栈中。
4. 如果字符是右括号,则进行以下操作:
- 如果栈为空或者栈顶不是左括号,则表达式不正确,返回 false。
- 如果栈顶是左括号,则将栈顶元素弹出。
5. 如果字符是数字或负号,则进行以下操作:
- 继续读取字符,直到遇到非数字字符为止,并将这个数字或负数转换为浮点数。
- 将该数字压入栈中。
6. 如果字符是运算符,则忽略。
7. 遍历结束后,如果栈为空,则表达式正确;否则,表达式不正确。
这只是一个简单的示例算法,实际情况可能更复杂。你可以根据需要进行扩展和修改。
相关问题
使用c++编写程序二、功能要求: 1.从键盘输入一段表达式(字符串),其中含有整数、加、减、乘、除。 2.计算表达式的值。 3.事先约定表达式无括号、无浮点数、无负数、无错误。
好的,我可以帮你解决这个问题。以下是一个简单的C++程序,可以实现你的要求:
```c++
#include <iostream>
#include <string>
#include <stack>
#include <cstdlib>
using namespace std;
int main()
{
string expression;
getline(cin, expression);
stack<int> numbers;
stack<char> operators;
for (int i = 0; i < expression.length(); i++)
{
if (expression[i] >= '0' && expression[i] <= '9')
{
int number = 0;
while (expression[i] >= '0' && expression[i] <= '9')
{
number = number * 10 + (expression[i] - '0');
i++;
}
i--;
numbers.push(number);
}
else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/')
{
if (operators.empty() || operators.top() == '+' || operators.top() == '-' || (expression[i] == '*' || expression[i] == '/') && (operators.top() == '*' || operators.top() == '/'))
{
operators.push(expression[i]);
}
else
{
int number2 = numbers.top();
numbers.pop();
int number1 = numbers.top();
numbers.pop();
char op = operators.top();
operators.pop();
int result;
switch (op)
{
case '+': result = number1 + number2; break;
case '-': result = number1 - number2; break;
case '*': result = number1 * number2; break;
case '/': result = number1 / number2; break;
}
numbers.push(result);
i--;
}
}
}
while (!operators.empty())
{
int number2 = numbers.top();
numbers.pop();
int number1 = numbers.top();
numbers.pop();
char op = operators.top();
operators.pop();
int result;
switch (op)
{
case '+': result = number1 + number2; break;
case '-': result = number1 - number2; break;
case '*': result = number1 * number2; break;
case '/': result = number1 / number2; break;
}
numbers.push(result);
}
cout << numbers.top() << endl;
return 0;
}
```
这个程序使用了两个栈,一个用于存储数字,一个用于存储运算符。程序首先从键盘读取表达式,并对表达式进行扫描。如果当前字符是数字,则将数字读取出来,并将其压入数字栈中。如果当前字符是运算符,则将其与运算符栈顶的运算符比较,如果当前运算符的优先级更高,则将其压入运算符栈中。否则,从数字栈中弹出两个数字,从运算符栈中弹出一个运算符,进行运算,并将结果压入数字栈中。最后,当表达式扫描完毕后,依次弹出运算符栈中的运算符,并进行运算,直到运算符栈为空。
需要注意的是,这个程序假设表达式无括号、无浮点数、无负数、无错误。如果表达式中包含这些内容,则需要进行相应的修改。
阅读全文