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. python3-声音处理

    先来说下二进制读写文件,这需要struct库 #二进制文件读写 import struct a= b=- # print(struct.pack("h",b)) # print(s ...

  2. 【第四章】Shell 条件测试表达式

    shell中条件测试的三种格式: 格式1: test 条件表达式格式2: [ 条件表达式 ]格式3: [[ 条件表达式 ]] 使用test: [root@host- ~]# test -f file ...

  3. “Hello World!”团队第三周召开的第五次会议

    一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.代码地址 一.会议时间 2017年10月31日  11:45-12:17 二.会议地点: ...

  4. 第二十次ScrumMeeting会议

    第二十次Scrum Meeting 时间:2017/12/10 地点:新主楼1039 人员:蔡帜 王子铭 游心 解小锐 王辰昱 李金奇 杨森 陈鑫 赵晓宇 照片: 目前工作进展 名字 今日 明天的工作 ...

  5. 数据库索引(结合B-树和B+树)

    数据库索引,是数据库管理系统中一个排序的数据结构以协助快速查询.更新数据库表中数据.索引的实现通常使用B树及其变种B+树. 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种 ...

  6. lintcode-184-最大数

    184-最大数 给出一组非负整数,重新排列他们的顺序把他们组成一个最大的整数. 注意事项 最后的结果可能很大,所以我们返回一个字符串来代替这个整数. #### 样例 给出 [1, 20, 23, 4, ...

  7. TCP系列12—重传—2、Linux超时重传引入示例

    在前面我们概述了TCP的超时重传之后我们简单的看一下tcp超时重传的示例.首先简单的描述一下测试过程 1.设置/proc/sys/net/ipv4/tcp_early_retrans为2,关掉TLP功 ...

  8. Ubuntu下erlang连接SQL SERVER 2008

    erlang连接SQL Server使用ODBC方法,但在网络上还是缺少资料,自己折腾了2天才成功.现在特记录下来,以供大家借鉴. 基本思路是 erlang odbcserver + unixodbc ...

  9. 软工网络15团队作业——Alpha阶段敏捷冲刺 DAY1

    Alpha阶段敏捷冲刺 DAY1 1.各个成员在 Alpha 阶段认领的任务 姓名 在Alpha阶段所认领的任务 陈龙 题目生成类的编写,随机生成合理题目的算法编写 郑佳明 答案计算类的编写,对随机生 ...

  10. 【Linux】- ps 命令

    Linux ps命令用于显示当前进程 (process) 的状态. 语法 ps [options] [--help] 参数: -A     列出所有的行程 -w    显示加宽可以显示较多的资讯 -a ...