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. [ Continuously Update ] The Paper List of Image / Video Captioning

    Papers Published in 2018 Convolutional Image Captioning - Jyoti Aneja et al., CVPR 2018 - [ Paper Re ...

  2. 2.azkaban3.0安装

    安装规划安装azkban1.安装配置数据库2.下载安装web server3.安装mulit executor4.安装azkaban插件AZKABAN参数安装出现的问题 安装规划 IP 角色 端口 1 ...

  3. hadoop问题集(2)

      28. Sqoop: java.lang.NullPointerException sqoop import --connect jdbc:oracle:thin:@//xxxx:1521/aps ...

  4. Python3 数据类型-集合

    在Python中集合set是基本数据类型的一种,它有可变集合(set)和不可变集合(frozenset)两种.创建集合set.集合set添加.集合删除.交集.并集.差集的操作都是非常实用的方法. 集合 ...

  5. 定点数(fixed-point number)

    定义 定点数(fixed-point number)就是小数点位置固定的数,也就是说,小数点后面的位数是固定的,比如要记录一笔账目,这些账目的数字都不会超过100,就可以使用2位小数位定点数来记录,比 ...

  6. java多线程三之线程协作与通信实例

    多线程的难点主要就是多线程通信协作这一块了,前面笔记二中提到了常见的同步方法,这里主要是进行实例学习了,今天总结了一下3个实例: 1.银行存款与提款多线程实现,使用Lock锁和条件Condition. ...

  7. Java Class Object

    Object类 它是所有类的基类. public class Person { } //实际上是 public class Person extends Object { } Object类的方法 t ...

  8. Tomcat服务器学习和使用(一)

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  9. mysql入门 — (1)

    使用cd进入到mysql/bin文件夹下面,或者配置完环境之后,直接在cmd中使用mysql,然后回车开启mysql. 登录 为了安全考虑,在这里只设置了本地root用户可以连接上数据库.使用的指令是 ...

  10. LintCode-88.最近公共祖先

    最近公共祖先 给定一棵二叉树,找到两个节点的最近公共父节点(LCA). 最近公共祖先是两个节点的公共的祖先节点且具有最大深度. 注意事项 假设给出的两个节点都在树中存在 样例 对于下面这棵二叉树 LC ...