【c++】表达式求值

注意,这道题的代码不是我写的,是别人(ptyz219)写的,我只是根据他的代码想到了思路而已
题目描述

给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。

输入格式

一行,为需要你计算的表达式,表达式中只包含数字、加法运算符“+”和乘法运算符“×”,且没有括号,所有参与运算的数字均为 0 到 231−1 之间的整数。

输入数据保证这一行只有0−9、+、×这 12种字符。

输出格式

一个整数,表示这个表达式的值。

注意:当答案长度多于 4 位时,请只输出最后4 位,前导0 不输出。

样例数据
样例输入#1
1+1*3+4
样例输出#1
8
样例输入#2
1+1234567890*1
样例输出#2
7891
样例输入#3
1+1000000003*1
样例输出#3
4
数据范围

对于 30%的数据,0≤ 表达式中加法运算符和乘法运算符的总数 ≤100;

对于 80%的数据,0≤ 表达式中加法运算符和乘法运算符的总数 ≤1000;

对于 100%的数据,0≤ 表达式中加法运算符和乘法运算符的总数 ≤100000。

---------------------------------------------------------------------------------------------------------------------------------

思路

首先,我们解题需要有思路,那这道题的思路是什么呢?

我们发现,输入是会输入大于9的数的,所以,如果我们输入的时候,把数字当字符来处理,会有些麻烦(因为数字不止一位,我们需要知道数字的输入是什么时候结束,还要把字符转成数字),所以,懒惰的我们当然会选择直接输入数字,我们当然是怎么方便怎么来了

所以,我们可以这样输入:先读入一个数字,然后开始循环,每次循环读入一个字符和一个数字

接下来,我们就因该进行计算了,我们来分析一下,这道题的难点就在于:乘法要比加法先算。我们想一下,我们在读入的时候,遇到乘法是不是可以直接计算?为什么呢?因为这道题中,输入保证没有括号,而加法一定是在乘法算完之后计算的,因此,我们在输入时遇到乘法,我们就直接计算

我们再想一下,我们在输入的时候就把乘法都算完了,那我们最后存下来的那些数字,是不是肯定是进行加法计算?因为除了乘法就是加法,乘法算完了,我们就可以把所有数字加起来,就能得到这道题的答案(看完思路,是不是觉得这题也很简单?)

---------------------------------------------------------------------------------------------------------------------------------

代码

下面是代码(别人的代码)

//答案来自ptyz219 
#include<bits/stdc++.h>
using namespace std;
stack<int>x;
int a,b;
char c;
int main(){
	ios::sync_with_stdio(NULL);//加速 
	cin.tie(NULL);cout.tie(NULL);//加速 
	cin>>a;//读入a,因为刚开始一定会输入一个数字 
	for(x.push(a%10000);cin>>c>>b;x.push(b))
	//将a后4位入栈,读入要计算的符号和下一个数字,将下一个数字入栈
    //可能有人不知道读入怎么停下来,我解释一下,读入停下来的时候,就是读到换行的时候
    //我们如果用cin来读入换行,我们会读到一个空白字符
    //而cin读到空白字符就会返回false,循环就停下来了
		if(c=='*'){//如果符号是乘号 
			a=x.top();//获取栈顶 
			x.pop();//将栈顶弹出 
			b=a*b%10000;//算出乘法的答案 
		}
	for(a=0;x.size();x.pop())
	//就是循环x.size次,次数增加一次,x就弹出一次栈顶 
		a=(a+x.top())%10000;//a这时为答案,把a和栈顶加起来
		//(因为乘法都算完了,所以剩下的肯定都是加法) 
	cout<<a;
	return 0;
}

怎么样?这道题还是很简单的吧?

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,让我为您分享 C 语言实现顺序栈求解表达式的代码。 ``` #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 #define MAXBUFFER 10 typedef struct { char *base; char *top; int stacksize; } SqStack; void InitStack(SqStack *S) { S->base = (char *) malloc(STACK_INIT_SIZE * sizeof(char)); if (!S->base) exit(0); S->top = S->base; S->stacksize = STACK_INIT_SIZE; } void Push(SqStack *S, char e) { if (S->top - S->base >= S->stacksize) { S->base = (char *) realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(char)); if (!S->base) exit(0); S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } *(S->top)++ = e; } char Pop(SqStack *S) { if (S->top == S->base) exit(0); return *--(S->top); } char GetTop(SqStack *S) { if (S->top != S->base) return *(S->top - 1); } int StackLen(SqStack S) { return S.top - S.base; } int main() { SqStack s; InitStack(&s); char buffer[MAXBUFFER]; char c, d; int len, i; double data, x, y; printf("输入表达式:"); scanf("%s", buffer); len = strlen(buffer); i = 0; while (i < len) { c = buffer[i]; if (isdigit(c)) { data = c - '0'; while (isdigit(buffer[++i])) { data = data * 10 + buffer[i] - '0'; } Push(&s, data); } else if (c == '+' || c == '-' || c == '*' || c == '/') { x = Pop(&s); y = Pop(&s); switch (c) { case '+': d = x + y; break; case '-': d = y - x; break; case '*': d = x * y; break; case '/': d = y / x; break; } Push(&s, d); i++; } else { i++; } } printf("计算结果为:%.2f\n", Pop(&s)); return 0; } ``` 这段代码中,我们采用了顺序栈来实现表达式求值。在输入表达式时,我们采用字符数组来存储输入的表达式,然后遍历该字符数组,将数字字符转化为数字,然后压入栈中,遇到运算符时,弹出栈顶的两个元素,进行相应的运算,将结果再次压入栈中,直到遍历完整个字符数组。最终,栈中剩下的元素就是表达式计算结果。 需要注意的是,在这段代码中,我们只考虑了表达式中的加减乘除运算,如果表达式中还包括其他的运算符,需要根据具体情况进行相应的修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值