Expression

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 202    Accepted Submission(s): 61

Problem Description
  As a shopkeeper of a restaurant,everyday ,dandelion's mother needs to calculate the incomes.Sometimes,she may make some mistakes.So dandelion wants you to write a program to help her calculate the value of some expressions.   You may consider every expression is made of :left parenthesis '(' ,right parenthesis ')' , plus sign '+' , subtraction sign '-' , multiplication sign '*' ,positive sign '+' ,and negative sign '-'.There is no precursor 0.The length of expression will not exceed 100.The value produced during the calculating will not exceed 10^9.Every expression is legal.Ie. ((10+(-100))) ,-(-1),-3*(+5+7*2)-(0) ,-0 ,(-3)*(-5+7) are legal,while 1+-7 ,--3+8 ,-3+() are illegal.
 
Input
There are several cases,every line contains a expression.
 
Output
For every case ,print the answer of the expression.
 
Sample Input
-3*(+5-7*2)-(0)
 
Sample Output
27
 
Author
dandelion
 
Source
 
 
栈的运用 考虑的比较多 使用  STL <stack>
详细的看注释
#include<bits/stdc++.h>
using namespace std;
char a[105];
stack<char> m;//运算符栈
stack<int> n;//操作室栈
map<char,int> mp;
//40 (
//41 )
//42 *
//43 +
//45 -
int main()
{
mp['-']=1;
mp['+']=1;
mp['*']=2;
mp['(']=-1;
mp[')']=-1;
memset(a,0,sizeof(a));
while(gets(a))
{ while(!m.empty())
m.pop();
while(!n.empty())
n.pop();
n.push(0);//考虑初始有符号 放在栈底
int len=strlen(a);
int exm=0;
int xx,yy;
char what;
for(int i=0; i<len; i++)
{
if(a[i]>=48&&a[i]<=57)
exm=exm*10+a[i]-'0';
else
{
if(a[i]=='(')// 前括号处理 添0 处理紧邻的符号
{
m.push(a[i]);
n.push(0);
continue;
}
if(m.empty())//若运算符栈为空
{
m.push(a[i]);
continue;
}
else
{
if(mp[a[i]]>mp[m.top()]) //优先级大于栈顶运算符
m.push(a[i]);
else
{//直到优先级大于栈顶 或 栈空 或栈顶为后括号(这个没有验证)
while(!m.empty()&&mp[a[i]]<=mp[m.top()]&&m.top()!='(')// 这里理解
{
xx=n.top();
n.pop();
yy=n.top();
n.pop();
what=m.top();
m.pop();
if(mp[what]==1)
{
if(what=='+')
n.push(yy+xx);
if(what=='-')
n.push(yy-xx);
}
if(mp[what]==2)
n.push(yy*xx);
}
if(!m.empty()&&m.top()=='('&&a[i]==')') //当前后括号相遇pop
m.pop();
else //否则插入
m.push(a[i]); }
continue;
}
}
if(i>=1)//处理前括号后若无符号
{
if(a[i-1]=='(')
n.pop();
}
if(mp[a[i+1]]!=0)//判断exm 积累结束
{
n.push(exm);
exm=0;
}
if(i==len-1&&a[i]!=')')//考虑最后一个操作数
n.push(exm); }
while(!m.empty())//直到 运算符栈空
{
xx=n.top();
n.pop();
yy=n.top();
n.pop();
what=m.top();
m.pop();
if(mp[what]==1)
{
if(what=='+')
n.push(yy+xx);
if(what=='-')
n.push(yy-xx);
}
if(mp[what]==2)
n.push(yy*xx);
}
printf("%d\n",n.top());//输出栈顶值
memset(a,0,sizeof(a));
}
return 0;
}

HDU 2646 栈的应用 STL的更多相关文章

  1. HDU - 1022 Train Problem I STL 压栈

    Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  2. hdu 1022 Train Problem I(栈的应用+STL)

    Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. 解决HDU爆栈的问题

    转载:http://forum.byr.edu.cn/article/ACM_ICPC/51264 大家懂的,鉴于HDU用的是windows服务器,所以stack大小及其坑爹,稍微深一点的递归栈就会s ...

  4. hdu 6040 Hints of sd0061(stl: nth_element(arr,arr+k,arr+n))

    Hints of sd0061 Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  5. 数据结构--栈(附上STL栈)

    定义: 栈是一种只能在某一端插入和删除数据的特殊线性表.他按照先进先出的原则存储数据,先进的数据被压入栈底,最后进入的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后被压入栈的,最先弹出).因此栈 ...

  6. ACM YTU 十进制与八进制的转换 (栈和队列) STL栈调用

    十进制与八进制的转换(栈和队列) Description 对于输入的任意一个非负十进制整数,利用栈打印输出与其等值的八进制数. Input 111 Output 157 Sample Input 14 ...

  7. UVa - 12096 集合栈计算机(STL)

    [题意] 有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始为空的栈,并且支持以下操作:PUSH:空集“{}”入栈DUP:把当前栈顶元素复制一份后再入栈UNION:出栈两个集合,然后把两 ...

  8. *HDU 1237 栈

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  9. hdu 2094 产生冠军(STL,set)

    题目 //把所有的出现的名字开始默认都为冠军(1),然后输了的置为0,表示不为冠军,最后统计不为0的, //当有且只有一个不为0的,这个就为冠军,否则,不能产生冠军. //以上思路来自别人的博客.. ...

随机推荐

  1. Java开发工程师(Web方向) - 04.Spring框架 - 第2章.IoC容器

    第2章.IoC容器 IoC容器概述 abstract: 介绍IoC和bean的用处和使用 IoC容器处于整个Spring框架中比较核心的位置:Core Container: Beans, Core, ...

  2. EasyUI学习心得

    因为要修改十几年前的一个项目界面,打9月份开始学习EasyUI,很多事情都要自己试过才知道,小问题会浪费很多时间.所以,就在此记录一下,随时更新. 一.引号 EasyUI的自定义关键字的识别,API文 ...

  3. 【未完】训练赛20190304:KMP+树状数组+线段树+优先队列

    头炸了啊,只做出L题,前两天刚看的Shawn zhou的博客学习的,幸亏看了啊,否则就爆零了,发现题目都是经典题,线段树,KMP,我都没看过,最近又在复习考研,真后悔大一大二没好好学习啊,得抽时间好好 ...

  4. LeetCode 120——三角形最小路径和

    1. 题目 2. 解答 详细解答方案可参考北京大学 MOOC 程序设计与算法(二)算法基础之动态规划部分. 从三角形倒数第二行开始,某一位置只能从左下方或者右下方移动而来,因此,我们只需要求出这两者的 ...

  5. github 使用“git commit -m"命令时候出现的一个小问题

    git commit -m 使用问题 今天提交文件到github,步骤是: git add abc.py (abc.py是我当前随意写的一个文件名) git commit -m 'add codes ...

  6. HADOOP docker(三):HDFS高可用实验

      前言1.机器环境2.配置HA2.1 修改hdfs-site.xml2.2 设置core-site.xml3.配置手动HA3.1 关闭YARN.HDFS3.2 启动HDFS HA4.配置自动HA4. ...

  7. selenium实现文件上传方法汇总(AutoIt、win32GUI、sengkeys)---基于python

    在使用selenium进行UI自动化测试时,经常会遇到一个关于本地文件上传的问题,解决此问题一般分两种情况: 1. 元素标签为input 2.非input型上传 下面我们分别对着两种情况进行实例分析 ...

  8. Android 开发错误集锦

    1. eclipse的Device中不显示手机 在eclipse中连接不上手机,出现adb server didn't ACK  fail to start daemon 错误. 出现这种原因是因为a ...

  9. com技术学习

    百度百科概念 COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术.在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应 ...

  10. Spring学习(二)—— java的动态代理机制

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...