编程求一个后缀表达式的值

【问题描述】

从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(-)、乘(*)、除(/)四种运算符。
每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。
以@作为结束标志。

【算法分析】

后缀表达式的处理过程很简单,过程如下:
扫描后缀表达式,凡遇操作数则将之压进堆栈,与运算符则从堆栈中弹出两个操作数进行该运算,将运算结果压栈,然后继续扫描,直到后缀表达式被扫描完毕为止,此时栈底元素即为该后缀表达式的值。

代码分析

#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
int stack[101];
char s[256];
int comp(char s[256])
{
	int i=0,top=0,x,y;
	while(i<=strlen(s)-2)
	{
		switch(s[i])
		{
			case '+':
				stack[--top]+=stack[top+1];break;
			case '-':
				stack[--top]-=stack[top+1];break;
			case '*':
				stack[--top]*=stack[top+1];break;
			case '/':
				stack[--top]/=stack[top+1];break;
			default:
				x=0;
				while(s[i]!=' ')
				x=x*10+s[i++]-'0';
				stack[++top]=x;
				break;
		}
		i++;
	}
	return stack[top];
}
int main ()
{
	printf("input a string (@_over):");
	gets(s);
	printf("result=%d",comp(s));
	return 0;
}

例题

【例1】后缀表达式的值

时间限制: 10 ms 内存限制: 65536 KB
提交数: 6618 通过数: 992

【题目描述】

从键盘读入一个后缀表达式(字符串),只含有0-9组成的运算数及加(+)、减(—)、乘(*)、除(/)四种运算符。
每个运算数之间用一个空格隔开,不需要判断给你的表达式是否合法。
以@作为结束标志。
提示:输入字符串长度小于250,参与运算的整数及结果之绝对值均在264范围内,如有除法保证能整除。

【输入】

一个后缀表达式。

【输出】

一个后缀表达式的值。

【输入样例】

16 9 4 3 +*-@

【输出样例】

-47

【来源】

No

【代码】

#include <stdio.h>
#include <string.h>
char a[10000];
long long stack[1000],top=-1;
int main()
{
    long long k=0,i=0,len,b,tag,d,e,f;
    char c;
    gets(a);
    len=strlen(a);
    while(i<len)
	{
        b=0,tag=0;
        while(i<len&&'0'<=a[i]&&a[i]<='9')
		b*=10,b+=a[i]-'0',i++,tag=1;
        if(tag) top++,stack[top]=b;
        else if(a[i]=='+'||a[i]=='-'||a[i]=='*'||a[i]=='/')
		{
            d=stack[top],top--;
            e=stack[top],top--;
            switch(a[i]){
                case '+':
                    f=e+d;
                    break;
                case '-':
                    f=e-d;
                    break;
                case '*':
                    f=e*d;
                    break;
                case '/':
                    f=e/d;
                    break;
            }
            top++;
            stack[top]=f;
            i++;
        }
		else i++;
    }
    printf("%lld",stack[top]);
    return 0;
}
原文地址:https://www.cnblogs.com/AlexKing007/p/12339448.html