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

栈是一种受到限制的线性表,其限制是仅允许在表的一端进行插入和删除运算。这也给予了栈的一个特性————先进后出(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. python 读取一个目录下的所有目录和文件

    #!/usr/bin/python # -*- coding:utf8 -*- import os allFileNum = 0 def printPath(level, path): global ...

  2. 8.21 js

    2018-8-21 20:05:43 2018-8-21 20:56:30 明天再看!!!! 今天空闲多看了书 <百年孤独> <苏东坡传> 打印结果  shanghai js的 ...

  3. js原型浅谈理解

    之前在学习原型(prototype)的时候,一直对原型的理解不是很清晰,只是知道每个对象都有一个原型,然后在js中万物又皆对象.在这里谈一下自己对于js原型的简单理解吧. 原型可以实现属性和方法的共享 ...

  4. centos6.9环境下JDK安装部署

    1.准备jdk安装文件: 这里我使用的是 jdk-7u79-linux-x64.tar.gz 2.在 /usr/local 目录下创建 sotfware目录,并上传JDK文件: 解压文件并修改文件夹为 ...

  5. php无限极分类递归与普通

    1. 递归 public function getInfo(){$data=$this->select();$arr=$this->noLimit($data,$f_id=0,$level ...

  6. ArcGIS API for javascript开发笔记(六)——REST详解及如何使用REST API调用GP服务

    感谢一路走来默默支持和陪伴的你~~~ -------------------欢迎来访,拒绝转载-------------------- 一.Rest API基础 ArcGIS 平台提供了丰富的REST ...

  7. Spring Data 介绍 (一)

    简介 Spring Data是什么 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得对数据的访问变得方便快捷 Spring Data JPA能干什么 可以极大的 ...

  8. vue - 组件的创建

    组件的创建 vue的核心基础就是组件的使用,玩好了组件才能将前面学的基础更好的运用起来.组件的使用更使我们的项目解耦合.更加符合vue的设计思想MVVM. 那接下来就跟我看一下如何在一个Vue实例中使 ...

  9. 杭电oj题目分类

    基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029.1032.1037.1040.1048.1056.1058.1 ...

  10. 洛谷P3389 高斯消元 / 高斯消元+线性基学习笔记

    高斯消元 其实开始只是想搞下线性基,,,后来发现线性基和高斯消元的关系挺密切就一块儿在这儿写了好了QwQ 先港高斯消元趴? 这个算法并不难理解啊?就会矩阵运算就过去了鸭,,, 算了都专门为此写个题解还 ...