2021-10-30
作者:互联网
表达式的后缀表示(C++)
数据结构第二次上机作业
#include <iostream>
#include <stack>
using namespace std;
bool IsOperator(char c) // 判断是否是操作符
{
if (c == '+' || c == '-' || c == '*' || c == '/')
{
return true;
}
return false; // 否则返回false
}
int GetPriority(char c)// 获取优先级``````
{
int priority = 0; // 优先级
switch (c)
{
case '(':
priority = 1;
break;
case '+':
case '-':
priority = 2;
break;
case '*':
case '/':
priority = 3;
break;
default:
break;
}
return priority;
}
int main(int a, const char* a1[])
{
cout << "请输入表达式" << endl;
int num;
char arr[100]; // 一个一个的读取表达式,直到遇到回车
stack<char> ope; // 存储操作符的栈
cin.getline(arr, 100);
int length, i, n = 0;
char c; // c存储从栈中取出的操作符
length = (int)strlen(arr);//强制转换
i = 0;
while (i < length)
{
if (arr[i] == '(')n++;
if (arr[i] == ')')n--;
i++;//注意
}
if (n == 0)
{
cout << "括号匹配" << endl;
}
else
{
cout << "括号不匹配" << endl;
}
i = 0;//注意
while (i < length)
{
while (i < length)
{
if (isdigit(arr[i])) // 如果是数字
{
num = 0;
do
{
num = num * 10 + (arr[i] - '0'); // 字符与数字之间的转换关系
i++; // 下一个字符
} while (isdigit(arr[i]));
cout << num << " ";
}
else if (arr[i] == '(')
{
ope.push(arr[i]);
i++;
}
else if (IsOperator(arr[i])) // 若是操作符
{
if (ope.empty())// 如果栈空,直接压栈
{
ope.push(arr[i]);
i++;
}
else
{
/* 比较栈ope顶的操作符与c的优先级,如果c的优先级高,则直接压栈
否则,栈中操作符出栈,直到操作符小于c的优先级,或者遇到(,或者栈空*/
while (!ope.empty())
{
c = ope.top();
if (GetPriority(arr[i]) <= GetPriority(c)) // 优先级低或等于
{
cout << c << " ";
ope.pop();
}
else // c优先级高于栈中操作符
break;
}
ope.push(arr[i]); // 防止操作符不断出栈,最后空栈了;或者c优先级高了
i++;
}
}
else if (arr[i] == ')') // 如果是右括号,栈中操作符一直出栈,直到遇到左括号(
{
while (ope.top() != '(')
{
cout << ope.top() << " ";
ope.pop();
}
ope.pop(); // 左括号出栈
i++;
}
else if ((65 <= (int)arr[i] && (int)arr[i] <= 90) || (97 <= (int)arr[i] && (int)arr[i] <= 122))//字符
{
cout << arr[i] << " ";
i++;
}
else // 如果是空白字符,就进行下一个字符的处理
{
i++;
cout << "单词不合法" << " ";
}
}
while (!ope.empty()) // 如果栈不空则输出操作符
{
cout << ope.top() << " ";
ope.pop();
}
cout << endl;
}
return 0;
system("pause");
}
标签:10,arr,cout,int,30,++,ope,操作符,2021 来源: https://blog.csdn.net/LYK13469998283/article/details/121055547