带货儿这周好像要截止到14题,已经在不知不觉中被缓慢拉开差距了。。。
思路
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char s[10000]; // 定义一个字符数组s,用于存储输入的中缀表达式
char num[10000]; // 定义一个字符数组num,用于存储转化后的后缀表达式
char opera[10000]; // 定义一个字符数组opera,用于存储操作符的栈
int j = 0; // 定义一个变量j,表示num数组的当前索引
int k = -1; // 定义一个变量k,表示opera数组的当前索引
fgets(s, 10000, stdin); // 读入用户输入的中缀表达式
int len = strlen(s);
int i = 0; // 获取中缀表达式的长度
while(i < len && s[i] != '\n' && s[i] != '\0') // 循环处理中缀表达式中的每一个字符(因为fgets会将输入末尾的'\n'也读入,所以要减去1)
{
if ((s[i] >= '0' && s[i] <= '9') ||(s[i]>='a'&&s[i]<='z') || (s[i] >= 'A' && s[i] <= 'Z')) //如果是数字或字母
{
num[j] = s[i]; // 将该数字或字母加入到num数组中
i++; // 遍历下一个字符
j++;
}
else if(k == -1)
{
opera[++k] = s[i];
i++;
}
else if (s[i] == '+' || s[i] == '-') //如果是加号或减号
{
switch (opera[k]) // 查看操作符栈顶元素
{
case '+':
case '-': // 如果栈顶元素也是加号或减号,则直接将当前操作符加入到栈中
opera[++k] = s[i];
i++;
continue;
case '*':
case '/': // 如果栈顶元素是乘号或除号,则将栈顶元素弹出,并将其加入到num数组中,然后将当前操作符加入到栈中
num[j] = opera[k];
opera[k] = s[i];
j++;
i++;
continue;
default: // 如果栈为空或栈顶元素是左括号,则将当前操作符加入到栈中
{
opera[++k] = s[i];
i++;
continue;
}
}
}
else if (s[i] == '*' || s[i] == '/') //如果是乘号或除号
{
switch (opera[k]) // 查看操作符栈顶元素
{
case '+':
case '-':
case '*':
case '/': // 如果栈顶元素是加、减、乘、除号,则将当前操作符加入到栈中
opera[++k] = s[i];
i++;
continue;
default: // 如果栈为空或栈顶元素是左括号,则将当前操作符加入到栈中
opera[++k] = s[i];
i++;
continue;
}
}
else if (s[i] == '(') // 如果是左括号,则将其加入到操作符栈中
{
opera[++k] = s[i];
i++;
continue;
}
else if (s[i] == ')') // 如果是右括号
{
while(k >= 0 && opera[k]!='(') // 则一直将操作符栈顶元素弹出,并将其加入到num数组中,直到遇到左括号
{
num[j++] = opera[k];
k--;
}
k--; // 将左括号弹出
i++;
continue;
}
}
while (k >= 0) // 处理完中缀表达式后,将操作符栈中剩余的元素依次弹出,并将其加入到num数组中
{
num[j++] = opera[k--];
}
for (int i = 0; i < j; i++) // 输出转化后的后缀表达式
{
printf("%c", num[i]);
}
return 0;
}