数据结构NOJ008逆波兰式

带货儿这周好像要截止到14题,已经在不知不觉中被缓慢拉开差距了。。。

思路

逆波兰表达式——中缀表达式转后缀表达式 - Luv3 - 博客园 (cnblogs.com)

#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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值