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


    【问题描述】

    从键盘读入一个后缀表达式(字符串),只含有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;
    }
    
  • 相关阅读:
    Django框架基础之序列化
    资产采集
    CMDB
    数据库--三层架构
    Django 项目一补充
    评论楼
    图片预览
    验证码
    如何使用C/C++动态库与静态库中的宏
    Matlab 直线方程、采样函数
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12339446.html
Copyright © 2020-2023  润新知