栈,作为一种最基础的数据结构(栈还是一种内存的存储形式,就不介绍了),在各种数据结构的题目都会间接或者直接用到。

栈是一种受到限制的线性表,其限制是仅允许在表的一端进行插入和删除运算。这也给予了栈的一个特性————先进后出(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的更多相关文章

  1. ACM第二站————归并排序

    转载请注明出处,谢谢!http://www.cnblogs.com/Asimple/p/5459664.html 归并排序————二分的思想 以中间的数为基准,每次排序都将比其小[升序排](大[降序排 ...

  2. ACM竞赛常用STL(一)

    全排列函数next_permutation STL 中专门用于排列的函数(可以处理存在重复数据集的排列问题) 头文件:#include <algorithm> using namespac ...

  3. Javascript之旅——第二站:对象和数组

    一觉睡到中午,本来准备起来洗洗继续睡,不过想想没辙,还得继续这个系列,走过变量的第一站,第二站我们再来看看对象和数组. 一:对象   说起对象,我们不自然就想起了面向对象中自封装的一个类,同样JS中也 ...

  4. LWIP network interface 即 LWIP 的 硬件 数据 接口 移植 详解 STM32 以太网数据 到达 的第二站: void ethernetif_input( void * pvParameters )

    根据 上一篇 文章 , ETH  DMA 数据中断 会 发送 一个信号量 ,我使用 全局 搜索 这个信号量 s_xSemaphore 得到 一下 几个 值 根据 这个 分析  我们找到了   数据 的 ...

  5. STL之stack操作

    c++ stl栈stack介绍 C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构. c++ stl栈stack的头文件 ...

  6. ACM竞赛常用STL(二)之STL--algorithm

    <algorithm>无疑是STL 中最大的一个头文件,它是由一大堆模板函数组成的.下面列举出<algorithm>中的模板函数: adjacent_find / binary ...

  7. C++ STL:stack和queue

    http://blog.csdn.net/wallwind/article/details/6858634 http://blog.csdn.net/chao_xun/article/details/ ...

  8. STL中stack小结

    (1)为了运用stack,你必须包含头文件<stack>:#include<stack> (2)在头文件中stack定义如下: namespace std{ template ...

  9. (ACM)C++ STL 训练(第一天)

    因为老师说ACM考的是纯C++,所以打算抛弃VS的VC++不用了,针对纯C++的编译器有Intel Compiler(不过要钱),MinGw(个人用的),当然还有微软的VC++ 编译器,IDE你们可以 ...

随机推荐

  1. JAVAORM框架之Mybatis (Ibatis) 详解

    目录 Mybatis基础概念 Mybatis开放方式演进 Mybatis框架核心要点 关联查询 延迟加载(懒加载) 动态SQL Mybatis缓存 Mybatis逆向工程 PageHelper分页插件 ...

  2. Postfix邮件

    一() 邮件相关协议 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议, 工作在TCP的25端口.它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的 ...

  3. table中强制不换行

    总是一些文章说要强制换行,很少提到说如何不换行. 一般都会使用word-break: keep-all;使得强制不换行. HTML <!DOCTYPE html PUBLIC "-// ...

  4. ubuntu下opencv2.4.9和opencv3.1.0的共存

    转载:ubuntu下opencv2.4.9和opencv3.1.0的共存 关于opencv3.1.0和opencv2.4.9的共存问题其实并不是什么大的问题,因此网上资料比较少.本人也是因为在安装Ro ...

  5. 如何使ul中li元素横向排列且不换行

    外层div容器宽度固定,ul宽度随li(li宽度固定)的增加而撑开,但是当ul中li的宽度之和大于div时,ul没有撑开,而是li换行了,如何使li不换行? 解决方法:主要是外面容器设置为white- ...

  6. 什么是安全散列算法SHA256?

    安全散列算法SHA(Secure Hash Algorithm)是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数,包括 SHA-1.SHA-224.S ...

  7. NEFU 118 - n!后面有多少个0 & NEFU 119 - 组合素数 - [n!的素因子分解]

    首先给出一个性质: n!的素因子分解中的素数p的幂为:[ n / p ] + [ n / p² ] + [ n / p³ ] + …… 举例证明: 例如我们有10!,我们要求它的素因子分解中2的幂: ...

  8. Nginx Upstream timed out (110: Connection timed out)

    Nginx Upstream timed out (110: Connection timed out) – 运维生存时间 http://www.ttlsa.com/nginx/nginx-upstr ...

  9. mysqli_report

    MYSQLI_REPORT_OFF Turns reporting off MYSQLI_REPORT_ERROR Report errors from mysqli function calls M ...

  10. jdb--gdb---java 远程调试(java application与web application)

    命令比较     gdb              jdb     bt             where     del           clear     stop         brea ...