ACM第二站————STL之stack
栈,作为一种最基础的数据结构(栈还是一种内存的存储形式,就不介绍了),在各种数据结构的题目都会间接或者直接用到。
栈是一种受到限制的线性表,其限制是仅允许在表的一端进行插入和删除运算。这也给予了栈的一个特性————先进后出(FILO)。
利用这一性质,我们可以试着去尝试下做出一个简易的计算器!
下面实战开始:
1.括号匹配
现在,有一行括号序列,请你检查这行括号是否配对。
- 输入
- 第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
- 输出
- 每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
- 样例输入
- 3
- [(])
- (])
- ([[]()])
- 样例输出
- No
- No
- Yes
- 思路:
- 利用栈的特性,进行匹配。当 是 ( 或者 [ 入栈 。遇到 ) 或 ] 则匹配栈顶元素。
- //Asimple
- #include <iostream>
- #include <cstdio>
- #include <stack>
- using namespace std;
- int T;
- stack<char> S;
- char str[10005];
- int main()
- {
- cin >> T ;
- while( T -- )
- {
- bool flag = true ;
- scanf("%s",str);
- for(int i=0; str[i]!=0; i++)
- {
- if( str[i]=='(' || str[i]=='[' )
- S.push(str[i]);
- else if( str[i] == ')' )
- {
- if( S.empty() || S.top() != '(' )
- {
- flag = false ;
- break;
- }
- else S.pop();
- }
- else
- {
- if( S.empty() || S.top() != '[' )
- {
- flag = false ;
- break ;
- }
- else S.pop();
- }
- }
- if( flag ) cout << "Yes" << endl ;
- else cout << "No" << endl ;
- while( !S.empty() ) S.pop();//初始化栈
- }
- return 0;
- }
接下来就直接写计算器吧!O(∩_∩)O
- #include<cstdio>
- #include<iostream>
- #include<stack>
- #include<cctype>
- #include<cmath>
- using namespace std;
- stack<double> Opnd;//操作数栈
- stack<char> Optr;//运算符栈
- void Init()//栈的初始化
- {
- while(!Opnd.empty())
- Opnd.pop();
- while(!Optr.empty())
- Optr.pop();
- Optr.push('=');//先压入一个结束符‘=’
- }
- char Precede(char i,char j) //判断i和j的优先级
- {
- switch(i)
- {
- case '+':
- case '-':
- if(j=='+'||j=='-'||j==')'||j=='=')
- return '>';
- else
- return '<';
- case '*':
- case '/':
- if(j=='(')
- return '<';
- else
- return '>';
- case '(':
- if(j==')')
- return '=';
- else
- return '<';
- case ')':
- return '>';
- case '=':
- if(j=='=')
- return '=';
- else
- return '<';
- }
- }
- double Operate(double a,char i,double b)//计算
- {
- switch (i)
- {
- case '+':
- return a+b;
- case '-':
- return a-b;
- case '*':
- return a*b;
- case '/':
- return a/b;
- }
- }
- int judge(char c)//判断---如果c为数字则返回1;若为小数点则返回2;如果c为操作符或者结束符则返回0;;
- {
- if(isdigit(c))
- return ;
- else if(c=='.')
- return ;
- else
- return ;
- }
- double EvaluateExpression(char *p)
- {
- double a,b,temp;
- int flag;
- char *st,*end,c,theta; //定义操作符theta
- Init();
- c=*p;
- while(c!='='||Optr.top()!='=')//即当操作符栈和当前读入的字符都是‘=’时结束循环
- {
- if(isdigit(c))//isdigit(c) 如果c是数字,则返回true; isalpha(c) 如果c是字母,则为true;
- {
- temp=;
- flag=;
- for(;judge(c);c=*(++p)) //当不是数字或小数点时结束循环
- {
- if(judge(c)==) //说明是数字
- {
- temp=temp*+c-'';
- if(c!=)
- end=p;
- }
- else //说明是小数点
- {
- st=p; //记录下小数点的位置
- end=p; //记录小数点后最后一个非零数字的位置
- flag=; //标记有小数点
- }
- }
- if(flag) //调整小数点的位置
- temp=temp/pow(,end-st);
- Opnd.push(temp); //记录的数字进栈
- }
- else
- {
- switch(Precede(Optr.top(),c))
- {
- case '<': //栈顶元素优先权低
- Optr.push(c);
- c=*(++p);
- break;
- case '>': //栈顶元素优先权高---退栈并将运算结果入栈
- theta=Optr.top();
- Optr.pop();
- a=Opnd.top();
- Opnd.pop();
- b=Opnd.top();
- Opnd.pop();
- Opnd.push(Operate(b,theta,a));
- break;
- case '=': //脱括号并接收下一字符
- Optr.pop();
- c=*(++p);
- }
- }
- }
- return Opnd.top();
- }
- int main()
- {
- int T;
- char s[];
- scanf("%d",&T);
- while(T--)
- {
- scanf("%s",s);
- printf("%.2lf\n",EvaluateExpression(s));
- }
- return ;
- }
ACM第二站————STL之stack的更多相关文章
- ACM第二站————归并排序
转载请注明出处,谢谢!http://www.cnblogs.com/Asimple/p/5459664.html 归并排序————二分的思想 以中间的数为基准,每次排序都将比其小[升序排](大[降序排 ...
- ACM竞赛常用STL(一)
全排列函数next_permutation STL 中专门用于排列的函数(可以处理存在重复数据集的排列问题) 头文件:#include <algorithm> using namespac ...
- Javascript之旅——第二站:对象和数组
一觉睡到中午,本来准备起来洗洗继续睡,不过想想没辙,还得继续这个系列,走过变量的第一站,第二站我们再来看看对象和数组. 一:对象 说起对象,我们不自然就想起了面向对象中自封装的一个类,同样JS中也 ...
- LWIP network interface 即 LWIP 的 硬件 数据 接口 移植 详解 STM32 以太网数据 到达 的第二站: void ethernetif_input( void * pvParameters )
根据 上一篇 文章 , ETH DMA 数据中断 会 发送 一个信号量 ,我使用 全局 搜索 这个信号量 s_xSemaphore 得到 一下 几个 值 根据 这个 分析 我们找到了 数据 的 ...
- STL之stack操作
c++ stl栈stack介绍 C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构. c++ stl栈stack的头文件 ...
- ACM竞赛常用STL(二)之STL--algorithm
<algorithm>无疑是STL 中最大的一个头文件,它是由一大堆模板函数组成的.下面列举出<algorithm>中的模板函数: adjacent_find / binary ...
- C++ STL:stack和queue
http://blog.csdn.net/wallwind/article/details/6858634 http://blog.csdn.net/chao_xun/article/details/ ...
- STL中stack小结
(1)为了运用stack,你必须包含头文件<stack>:#include<stack> (2)在头文件中stack定义如下: namespace std{ template ...
- (ACM)C++ STL 训练(第一天)
因为老师说ACM考的是纯C++,所以打算抛弃VS的VC++不用了,针对纯C++的编译器有Intel Compiler(不过要钱),MinGw(个人用的),当然还有微软的VC++ 编译器,IDE你们可以 ...
随机推荐
- JavaEE JSP 学习笔记
一.JSP简介 1.也是SUN公司推出的开发动态web资源的技术,属于JavaEE技术之一.由于原理上是Servlet, 所以JSP/Servlet在一起. 二.HTML.Servlet和JSP 1. ...
- HDU 3903 Trigonometric Function(数学定理)
Trigonometric Function Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Oth ...
- 2.4scope
name_scope variable_scope scope (name_scope/variable_scope) from __future__ import print_function im ...
- hdfs启用垃圾站功能
在core-site.xml文件中添加如下内容: ##开启回收站功能,设置保存7天删除数据信息 <property> <name>f ...
- python3学习笔记(6)_iteration
#python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #类似 其他语言的for循环,但是比for抽象程度更高 # f ...
- 转:PrintWriter中write与println方法的区别
原文地址:https://blog.csdn.net/qq_25610165/article/details/57083118 自己遇到的问题是:刚开始学 socket 通讯, 代码运行是好着的,后来 ...
- 图片预览-兼容IE
直接贴代码吧: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- 在ios上时间无法parse返回 "Invalid Date"
百度搜索:" ios 上面 new date" 关键字 BUG 描述直接上原码 var psrseDate = Date.parse("2010-03-15 10:30: ...
- Selenium之WebdriverApi详解
获取标签元素 # 通过ID定位目标元素 driver.find_element_by_id('#i1') # 通过classname定位目标元素 driver.find_element_by_clas ...
- IP追踪
cmd里输入:tracert www.baidu.com 上图箭头方框中就是对应公司的总网IP