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

栈是一种受到限制的线性表,其限制是仅允许在表的一端进行插入和删除运算。这也给予了栈的一个特性————先进后出(FILO)。

利用这一性质,我们可以试着去尝试下做出一个简易的计算器!

下面实战开始:

1.括号匹配

现在,有一行括号序列,请你检查这行括号是否配对。

输入
第一行输入一个数N(0<N<=100),表示有N组测试数据。后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串),测试数据组数少于5组。数据保证S中只含有"[","]","(",")"四种字符
输出
每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No
样例输入
3
[(])
(])
([[]()])
样例输出
No
No
Yes
思路:
利用栈的特性,进行匹配。当 是 (  或者 [  入栈 。遇到 ) 或 ]  则匹配栈顶元素。
  1. //Asimple
  2.  
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <stack>
  6.  
  7. using namespace std;
  8. int T;
  9. stack<char> S;
  10. char str[10005];
  11.  
  12. int main()
  13. {
  14. cin >> T ;
  15. while( T -- )
  16. {
  17. bool flag = true ;
  18. scanf("%s",str);
  19. for(int i=0; str[i]!=0; i++)
  20. {
  21. if( str[i]=='(' || str[i]=='[' )
  22. S.push(str[i]);
  23. else if( str[i] == ')' )
  24. {
  25. if( S.empty() || S.top() != '(' )
  26. {
  27. flag = false ;
  28. break;
  29. }
  30. else S.pop();
  31. }
  32. else
  33. {
  34. if( S.empty() || S.top() != '[' )
  35. {
  36. flag = false ;
  37. break ;
  38. }
  39. else S.pop();
  40. }
  41. }
  42. if( flag ) cout << "Yes" << endl ;
  43. else cout << "No" << endl ;
  44. while( !S.empty() ) S.pop();//初始化栈
  45. }
  46.  
  47. return 0;
  48. }

接下来就直接写计算器吧!O(∩_∩)O

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<stack>
  4. #include<cctype>
  5. #include<cmath>
  6.  
  7. using namespace std;
  8.  
  9. stack<double> Opnd;//操作数栈
  10. stack<char> Optr;//运算符栈
  11.  
  12. void Init()//栈的初始化
  13. {
  14. while(!Opnd.empty())
  15. Opnd.pop();
  16. while(!Optr.empty())
  17. Optr.pop();
  18. Optr.push('=');//先压入一个结束符‘=’
  19. }
  20.  
  21. char Precede(char i,char j) //判断i和j的优先级
  22. {
  23. switch(i)
  24. {
  25. case '+':
  26. case '-':
  27. if(j=='+'||j=='-'||j==')'||j=='=')
  28. return '>';
  29. else
  30. return '<';
  31. case '*':
  32. case '/':
  33. if(j=='(')
  34. return '<';
  35. else
  36. return '>';
  37. case '(':
  38. if(j==')')
  39. return '=';
  40. else
  41. return '<';
  42. case ')':
  43. return '>';
  44. case '=':
  45. if(j=='=')
  46. return '=';
  47. else
  48. return '<';
  49. }
  50. }
  51.  
  52. double Operate(double a,char i,double b)//计算
  53. {
  54. switch (i)
  55. {
  56. case '+':
  57. return a+b;
  58. case '-':
  59. return a-b;
  60. case '*':
  61. return a*b;
  62. case '/':
  63. return a/b;
  64. }
  65. }
  66.  
  67. int judge(char c)//判断---如果c为数字则返回1;若为小数点则返回2;如果c为操作符或者结束符则返回0;;
  68. {
  69. if(isdigit(c))
  70. return ;
  71. else if(c=='.')
  72. return ;
  73. else
  74. return ;
  75. }
  76.  
  77. double EvaluateExpression(char *p)
  78. {
  79. double a,b,temp;
  80. int flag;
  81. char *st,*end,c,theta; //定义操作符theta
  82. Init();
  83. c=*p;
  84. while(c!='='||Optr.top()!='=')//即当操作符栈和当前读入的字符都是‘=’时结束循环
  85. {
  86. if(isdigit(c))//isdigit(c) 如果c是数字,则返回true; isalpha(c) 如果c是字母,则为true;
  87. {
  88. temp=;
  89. flag=;
  90. for(;judge(c);c=*(++p)) //当不是数字或小数点时结束循环
  91. {
  92. if(judge(c)==) //说明是数字
  93. {
  94. temp=temp*+c-'';
  95. if(c!=)
  96. end=p;
  97. }
  98. else //说明是小数点
  99. {
  100. st=p; //记录下小数点的位置
  101. end=p; //记录小数点后最后一个非零数字的位置
  102. flag=; //标记有小数点
  103. }
  104. }
  105. if(flag) //调整小数点的位置
  106. temp=temp/pow(,end-st);
  107. Opnd.push(temp); //记录的数字进栈
  108. }
  109. else
  110. {
  111. switch(Precede(Optr.top(),c))
  112. {
  113. case '<': //栈顶元素优先权低
  114. Optr.push(c);
  115. c=*(++p);
  116. break;
  117. case '>': //栈顶元素优先权高---退栈并将运算结果入栈
  118. theta=Optr.top();
  119. Optr.pop();
  120. a=Opnd.top();
  121. Opnd.pop();
  122. b=Opnd.top();
  123. Opnd.pop();
  124. Opnd.push(Operate(b,theta,a));
  125. break;
  126. case '=': //脱括号并接收下一字符
  127. Optr.pop();
  128. c=*(++p);
  129. }
  130. }
  131. }
  132. return Opnd.top();
  133. }
  134.  
  135. int main()
  136. {
  137. int T;
  138. char s[];
  139. scanf("%d",&T);
  140. while(T--)
  141. {
  142. scanf("%s",s);
  143. printf("%.2lf\n",EvaluateExpression(s));
  144. }
  145. return ;
  146. }

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. Gym-101375C MaratonIME eats japanese food 初始化struct技巧

    题意:两种操作:A ,R 分别有三个参数,表示放或者移走(x,y)处半径为r的盘子.5000次操作,每次操作判断是否可行. 题解:两种情况不行:1.相交2.放到桌子外面.5000的数据直接模拟,删除操 ...

  2. CVPixelBuffer

    https://www.cnblogs.com/psklf/p/7700834.html https://stackoverflow.com/questions/16475737/convert-ui ...

  3. Charles 使用(拦截与修改)

    一.http 拦截(Breakpoints) 选取需要拦截的地址,鼠标右击选择Breakpoints 二.拦截结果与修改 可以在请求与返回结果中修改内容 1.所拦截的数据包 2.所拦截的请求 3.所拦 ...

  4. 借用HTML5 插入视频。音频

    HTML5 规定了一种通过 video 元素来包含视频的标准方法. 插入视频 <video width="320" height="240" contro ...

  5. Python安装及运行中可能遇到的问题。

    1.报错找不到Selenium. 解决办法: (1)可以调整工具中的以下两项 Setting: (2)Setting中设置此目录为Python安装目录,选择设置中的第一项后配置以下Python3.5的 ...

  6. hadoop备战:yarn框架的简单介绍(mapreduce2)

    新 Hadoop Yarn 框架原理及运作机制 重构根本的思想是将 JobTracker 两个基本的功能分离成单独的组件,这两个功能是资源管理和任务调度 / 监控.新的资源管理器全局管理全部应用程序计 ...

  7. android 操作SD卡上的文件

    (1)说明:操作SD卡上的文件须要增加下面权限  在SD卡上创建和删除文件权限  <uses-permission android:name="android.permission.M ...

  8. Oracle Golden Gate原理简介

    Oracle Golden Gate原理简介 http://www.askoracle.org/oracle/HighAvailability/20140109953.html#6545406-tsi ...

  9. POD类型

    POD类型 POD全称Plain Old Data.通俗的讲,一个类或结构体通过二进制拷贝后还能保持其数据不变,那么它就是一个POD类型. C++11将POD划分为两个基本概念的合集,即:平凡的和标准 ...

  10. java客户端调用ftp上传下载文件

    1:java客户端上传,下载文件. package com.li.utils; import java.io.File; import java.io.FileInputStream; import ...