zoukankan      html  css  js  c++  java
  • 编程求一个后缀表达式的值

    【问题描述】

    从键盘读入一个后缀表达式(字符串),只含有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;
    }
    
  • 相关阅读:
    UVa OJ 148 Anagram checker (回文构词检测)
    UVa OJ 134 LoglanA Logical Language (Loglan逻辑语言)
    平面内两条线段的位置关系(相交)判定与交点求解
    UVa OJ 130 Roman Roulette (罗马轮盘赌)
    UVa OJ 135 No Rectangles (没有矩形)
    混合函数继承方式构造函数
    html5基础(第一天)
    js中substr,substring,indexOf,lastIndexOf,split等的用法
    css的textindent属性实现段落第一行缩进
    普通的css普通的描边字
  • 原文地址:https://www.cnblogs.com/AlexKing007/p/12339447.html
Copyright © 2011-2022 走看看