C语言实现逆波兰表示法(栈)

逆波兰表示法的概念

逆波兰表示法是一种将运算符写在操作数后面的描述程序( 算式 )的方法。举个例子,我们平常用中缀表示法描述的算式( 1 +2 ) * ( 5+
4 ),改为逆波兰表示法之后则是12 + 54 +*。相较于中缀表示法,逆波兰表示法的优势在于不需要括号

实现过程

  1. 主要使用了栈的数据结构
  2. 现在我有式子 12 + 54 +* ,1 2先压入栈,遇到运算符后,把 1 2取出来,用遇到的运算符进行运算,1 + 2 = 3;再把3压入里面,在压5 4,遇到运算符+后 取出5 4 进行运算,得 9 ,在把9压入,遇到*后 取出进行运

总结

程序在计算时从算式开头逐一读取字符串,如果字符串是操作数( 数值 )则压人栈,如果是运算符( + 、 -
*)则从栈中取出两个数值算出结果再压入栈,如此循环。 最终栈中剩下的数值便是答案

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int top,S[1000];
void push(int x){//元素入栈
    top++;
    S[top] = x;
    }
int pop(){//元素出栈
    top--;
    return S[top+1];
    }
int main()
{
    int a,b,i=0;
    top = 0;
    char s[100];
    while(scanf("%s",s)!= EOF){//输入数据以空格相断 如1 2 * 3 4而不是12*34因为scanf("%s",s)读取不了空格后面的,但是while并没有结束,还可以接着输入
        if (s[0] == '+'){
            a = pop();
            b = pop();
            push(a+b);
        }
        else if(s[0] == '-'){
            a = pop();
            b = pop();
            push(b - a);
        }
        else if(s[0] == '*'){
            a = pop();
            b = pop();
            push(a*b);
        }
        else{

            push(atoi(s));
            printf("%d\n",atoi(s));//把字符串变为数字,传入的字符串首地址
        }

    }
    printf("%d",pop());
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值