原文地址:http://www.cppblog.com/GUO/archive/2010/09/12/126483.html

  1. /*
  2. 括号匹配问题,比较经典,利用堆栈来实现(摘自internet)
  3.  
  4. 1. 括号匹配的四种可能性:
  5.  
  6. ①左右括号配对次序不正确
  7. ②右括号多于左括号
  8. ③左括号多于右括号
  9. ④左右括号匹配正确
  10.  
  11. 2. 算法思想:
  12.  
  13. 顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈;
  14. 当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;
  15. 若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确;
  16. 若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号;
  17. 字符串循环扫描结束时,若堆栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号;
  18. 否则,括号配对正确。
  19.  
  20. 3. 程序实现:
  21. */
  22. #include <iostream>
  23. using namespace std;
  24.  
  25. #define maxsize 100
  26.  
  27. struct sStack
  28. {
  29. char sign[maxsize];
  30. int top;
  31. };
  32.  
  33. int InitsStack(sStack &SS)
  34. {
  35. SS.top=-1;
  36. return 1;
  37. }
  38.  
  39. int IsEmptysStack(sStack &SS)
  40. {
  41. if(SS.top==-1)
  42. return 1;
  43. return 0;
  44. }
  45.  
  46. int PushsStack(sStack &SS,char c)
  47. {
  48. SS.sign[++SS.top]=c;
  49. return 1;
  50. }
  51.  
  52. int UpsStack(sStack &SS)
  53. {
  54. if(IsEmptysStack(SS))
  55. {
  56. cout<<"栈空"<<endl;
  57. return 0;
  58. }
  59. SS.top--;
  60. return 1;
  61. }
  62.  
  63. char TopsStack(sStack &SS)
  64. {
  65. if(IsEmptysStack (SS))
  66. {
  67. cout <<"栈空"<<endl;
  68. return 0;
  69. }
  70. return SS.sign[SS.top];
  71. }
  72.  
  73. int main()
  74. {
  75. string s;
  76. cout<<"输入表达式:";
  77. cin>>s;
  78. int length=s.length();
  79. int i;
  80. sStack SS;
  81. InitsStack(SS);
  82. for(i=0;i<length;++i)
  83. {
  84. if(s[i]=='('||s[i]=='['||s[i]=='{')
  85. PushsStack(SS,s[i]);
  86. else if(s[i]==')'&&!IsEmptysStack(SS)&&TopsStack(SS)=='(')
  87. UpsStack(SS);
  88. else if(s[i]==')'&&!IsEmptysStack(SS)&&TopsStack(SS)!='(')
  89. cout<<"括号匹配次序不正确"<<endl;
  90. else if(s[i]==']'&&!IsEmptysStack(SS)&&TopsStack(SS)=='[')
  91. UpsStack(SS);
  92. else if(s[i]==']'&&!IsEmptysStack(SS)&&TopsStack(SS)!='[')
  93. cout<<"括号匹配次序不正确"<<endl;
  94. else if(s[i]=='}'&&!IsEmptysStack(SS)&&TopsStack(SS)=='{')
  95. UpsStack(SS);
  96. else if(s[i]=='}'&&!IsEmptysStack(SS)&&TopsStack(SS)!='{')
  97. cout<<"括号匹配次序不正确"<<endl;
  98. else if((s[i]==')'||s[i]==']'||s[i]=='}')&&IsEmptysStack(SS))
  99. cout<<"右括号多于左括号"<<endl;
  100. }
  101. if(!IsEmptysStack(SS))
  102. cout<<"左括号多于右括号"<<endl;
  103. else if(i=(length-1)&&IsEmptysStack(SS))
  104. cout<<"括号匹配正确"<<endl;
  105.  
  106. system("PAUSE");
  107. return 0;
  108. }

  

括号匹配问题(C++、堆栈)的更多相关文章

  1. 一起talk C栗子吧(第二十回:C语言实例--括号匹配)

    各位看官们,大家好.前几回中咱们说了堆栈的原理,而且举了实际的样例进行讲解,这一回咱们说的例 子是:括号匹配. 括号匹配使用了堆栈的原理,大家能够从样例看出来.所以我们把它们放在一起.闲话 休提.言归 ...

  2. NYOJ-2 括号配对问题 -- 数据结构_堆栈

    以前做过的,现在整理一下,主要是堆栈的使用 1.碰到左括号就入栈,碰到右括号就从栈里弹出一个和当前比配,匹配失败就肯定是NO了; 2.如果右括号弹栈的时候栈空,则说明之前没有和右括号匹配的左括号了,这 ...

  3. 《LeetBook》leetcode题解(20):Valid Parentheses[E]——栈解决括号匹配问题

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  4. HDU 4283 You Are the One ★(进出栈的括号匹配性质:区间DP)

    题意 有一个队列,每个人有一个愤怒值D,如果他是第K个上场,不开心指数就为(K-1)*D.但是边上有一个小黑屋(一个FILO堆栈),可以一定程度上调整上场程序,求一种安排上场方案使得所有人的不开心指数 ...

  5. 九度OJ 1153:括号匹配问题 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5193 解决:2248 题目描述: 在某个字符串(长度不超过100)中有左括号.右括号和大小写字母:规定(与常见的算数式子一样)任何一个左括 ...

  6. 括号匹配性检测C语言实现

    #include <stdio.h> #define SIMPLE_KUOHAO "(()1231qeqw)(@#$)" #define COMPLEX_KUOHAO ...

  7. 【九度OJ】题目1153:括号匹配问题 解题报告

    [九度OJ]题目1153:括号匹配问题 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1153 题目描述: 在某个字符串(长度不超过1 ...

  8. 括号匹配 区间DP (经典)

    描述给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来 ...

  9. YTU 3003: 括号匹配(栈和队列)

    3003: 括号匹配(栈和队列) 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 [提交][状态][讨论版] 题目描述 假设一个表达式中只允许包含三种括号:圆括号&quo ...

随机推荐

  1. 返回本机的mac物理路径

     /// <summary>         ///    返回本机的mac物理路径         /// </summary>         /// <return ...

  2. 【转】UltraISO制作U盘启动盘安装Win7/9/10系统攻略

    U盘安装好处就是不用使用笨拙的光盘,光盘还容易出现问题,无法读取的问题.U盘体积小,携带方便,随时都可以制作系统启动盘. U盘建议选择8G及以上大小的. 下面一步一步讲解如果制作U盘安装盘: 1.首先 ...

  3. Search in Rotated Sorted Array (I, II) 解答

    Question Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 ...

  4. Spring集成Hessian

    一.概述 Spring 通过org.springframework.remoting.caucho.HessianServiceExporter将POJO中的所有public方法发布为Hessian服 ...

  5. hdu 1011 Starship Troopers_树状dp

    题目链接 题意:给你一棵树(必须从根节点出发),每个节点上都有bug和value,你有m个骑士,每个骑士能消灭20个bug,你必须消灭该节点的全部bug才能拿到该节点的value,问最多能拿到valu ...

  6. 【Python脚本】Eclipse IDE扩展PyDev插件安装

    作为一名Python的初学者,其实不用太在意IDE了,我觉得开始的时候用用自带的 IDLE 也挺好的. 还有 DreamPie 也挺好的.都是一些轻量级的IDE. 因为我正好安装有Eclipse,平时 ...

  7. c++中经常需要访问对象中的成员的三种方式

    可以有3种方法: 通过对象名和成员运算符访问对象中的成员; 通过指向对象的指针访问对象中的成员; 通过对象的引用变量访问对象中的成员. 一.通过对象名和成员运算符访问对象中的成员 例如在程序中可以写出 ...

  8. hdu 5432 Pyramid Split(二分搜索)

    Problem Description Xiao Ming is a citizen who's good at playing,he has lot's of gold cones which ha ...

  9. 数据分析系统DIY3/3:本地64位WIN7+matlab 2012b訪问VMware CentOS7+MariaDB

    数据分析系统DIY中要完毕的三个任务. 一.用VMware装64位CentOS.数据库服务端用CentOS自带的就好. 二.数据採集与预处理用Dev-C++编程解决. 三.用本地Win7 64上的MA ...

  10. java集合总结【转】

    Map.Set.Iterator迭代详解 Map接口定义了四种类型的方法,每个Map都包含这些方法. equals(Object o)比较指定对象与此Map的等价性. hashCode()返回此Map ...