zoukankan      html  css  js  c++  java
  • 纪念逝去的计算器之计算表达式结果

    小 V 发明了一个神奇的整数计算器:

    给定一个合法的表达式,这个计算器能求出这个表达式的最终答案。

    表达式可能包含:

    +:运算符,整数加法。如 1+1=2

    -:运算符,整数减法。如 1-1=0

    :运算符,整数乘法。如 11=1

    /:运算符,整数除法。如 3/2=1

    (:左括号

    ):右括号

    操作数:保证为非负整数,且操作数没有正号(如不会出现+1 等)
    现在,给定一个表达式,小 V 在用这个计算器计算前想先知道最终答案是多少,你能 帮帮他吗?

    ★数据输入
    一个合法的表达式,表达式长度不超过 1000。

    ★数据输出
    表达式的最终结果。

    ★Notice
    题目保证:输入的操作数,计算的中间值,计算的最终结果都在 int 范围内

    ★样例
    输入示例 1+1 1+2/3 (1+2)*3
    输出示例 2 1 9

     
                #include<iostream>
    #include<string>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<stack>
    
    using namespace std;
    
    stack<int> Num_Stk;
    stack<char>Oper_Stk;
    
    int Oper_Big(char ch)
    {
    	
    	if (Oper_Stk.empty() || ch == '(' || (Oper_Stk.top() == '('&&ch != ')'))
    	{
    		return 0;
    	}
    	else if ((Oper_Stk.top() == '+' || Oper_Stk.top() == '-') && (ch == '*' || ch == '/'))
    	{
    		return 0;
    	}
    	else if (Oper_Stk.top() == '('&&ch == ')')
    	{
    		Oper_Stk.pop(); return 1;
    	}
    	else return -1;
    }
    
    void Deal_num()
    {
    	int num1 = Num_Stk.top(); Num_Stk.pop();
    	int num2 = Num_Stk.top(); Num_Stk.pop();
    	int ans = 0;
    	if (Oper_Stk.top() == '+')	ans = num1 + num2;
    	else if (Oper_Stk.top() == '-')	ans = num2 - num1;
    	else if (Oper_Stk.top() == '*')	ans = num1*num2;
    	else if (Oper_Stk.top() == '/')ans = num2 / num1;
    	Num_Stk.push(ans);
    	Oper_Stk.pop();
    
    }
    
    int main()
    {
    	int num = 0;
    	char str[1000] = "";
    	cin >> str;
    	int i = 0, j = 0, k = 0;
    	while (str[i] != '')
    	{
    		char expre[1005]; j = 0;
    		while (str[i] >= '0'&&str[i] <= '9')
    		{
    			expre[j] = str[i]; i++;
    			j++; expre[j] = '';
    		}
    		if (str[i] != '(')
    		{
    			num = atoi(expre);
    			Num_Stk.push(num);
    		}
    		while (1)
    		{
    			k = Oper_Big(str[i]);
    			if (k == 0)
    			{
    				Oper_Stk.push(str[i]);
    				break;
    			}
    			else if (k == 1)
    			{
    				i++;
    			}
    			else if (k == -1)
    			{
    				Deal_num();
    			}
    		}
    		i++;
    	}
    	cout << Num_Stk.top() << endl;
    	return 0;
    }
            
    

    之前老师布置的C++作业自己没有充分利用机会学习,这次算是后续弥补小部分,还有产生随机表达式的部分;

    大致思路:一个数字处理函数,一个符号优先级处理函数,过程中用两个栈实现,一个int型存数字处理,一个char型存操作符处理;
    在操作符优先级处理的时候考虑几种特殊的情况考虑很方便。

  • 相关阅读:
    SQL结构化查询语言
    数据库主外键
    SQL数据库数据类型详解
    注释和特殊符号
    文本装饰
    列表样式
    网页背景
    SQL数据库数据类型详解
    数据库主外键
    Update 语句
  • 原文地址:https://www.cnblogs.com/heihuifei/p/7681219.html
Copyright © 2011-2022 走看看