括号匹配问题(C++、堆栈)

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

/*
括号匹配问题,比较经典,利用堆栈来实现(摘自internet)

1. 括号匹配的四种可能性:

①左右括号配对次序不正确
②右括号多于左括号
③左括号多于右括号
④左右括号匹配正确

2. 算法思想:

顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈;
当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断;
若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确;
若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号;
字符串循环扫描结束时,若堆栈非空(即堆栈尚有某种类型的左括号),则说明左括号多于右括号;
否则,括号配对正确。

3. 程序实现:
*/
#include <iostream>
using namespace std;

#define maxsize 100

struct sStack
{
     char sign[maxsize];
     int top;
};

int InitsStack(sStack &SS)
{
     SS.top=-1;
     return 1;
}

int IsEmptysStack(sStack &SS)
{
     if(SS.top==-1)
         return 1;
     return 0;
}

int PushsStack(sStack &SS,char c)
{
     SS.sign[++SS.top]=c;
     return 1;
}

int UpsStack(sStack &SS)
{
    if(IsEmptysStack(SS))
    {
         cout<<"栈空"<<endl;
         return 0;
    }
    SS.top--;
    return 1;
}

char TopsStack(sStack &SS)
{
    if(IsEmptysStack (SS))
    {
         cout <<"栈空"<<endl;
         return 0;
    }
    return SS.sign[SS.top];
}

int main()
{
     string s;
     cout<<"输入表达式:";
     cin>>s;
     int length=s.length();
     int i;
     sStack SS;
     InitsStack(SS);
     for(i=0;i<length;++i)
     {
           if(s[i]==‘(‘||s[i]==‘[‘||s[i]==‘{‘)
                    PushsStack(SS,s[i]);
           else if(s[i]==‘)‘&&!IsEmptysStack(SS)&&TopsStack(SS)==‘(‘)
                UpsStack(SS);
           else if(s[i]==‘)‘&&!IsEmptysStack(SS)&&TopsStack(SS)!=‘(‘)
                    cout<<"括号匹配次序不正确"<<endl;
           else if(s[i]==‘]‘&&!IsEmptysStack(SS)&&TopsStack(SS)==‘[‘)
                    UpsStack(SS);
           else if(s[i]==‘]‘&&!IsEmptysStack(SS)&&TopsStack(SS)!=‘[‘)
                    cout<<"括号匹配次序不正确"<<endl;
           else if(s[i]==‘}‘&&!IsEmptysStack(SS)&&TopsStack(SS)==‘{‘)
                    UpsStack(SS);
           else if(s[i]==‘}‘&&!IsEmptysStack(SS)&&TopsStack(SS)!=‘{‘)
                    cout<<"括号匹配次序不正确"<<endl;
           else if((s[i]==‘)‘||s[i]==‘]‘||s[i]==‘}‘)&&IsEmptysStack(SS))
                    cout<<"右括号多于左括号"<<endl;
     }
     if(!IsEmptysStack(SS))
           cout<<"左括号多于右括号"<<endl;
     else if(i=(length-1)&&IsEmptysStack(SS))
           cout<<"括号匹配正确"<<endl;

     system("PAUSE");
     return 0;
}

  

时间: 2024-10-19 00:09:37

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

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

各位看官们,大家好,前几回中咱们说了堆栈的原理,并且举了实际的例子进行解说,这一回咱们说的例 子是:括号匹配.括号匹配使用了堆栈的原理,大家可以从例子看出来,所以我们把它们放在一起.闲话 休提,言归正转.让我们一起talk C栗子吧! 看官们,所谓的括号匹配,就是给了一连串括号,里面有各种类型的的括号,然后确定该串中的括号是否 是一一 匹配的.例如:({[]})这串括号中的括号就是匹配的.因为串中的括号都是成对出现.(({)这串括号就 不是匹配的,串中{没有与它配对的括号,而且与(匹配的括号数量

堆栈_括号匹配

class Solution { public: bool isValid(string s) { if(s.empty()) return false; stack<int> s1; int n=s.size(); for(int i=0;i<n;i++) { if(s[i]=='('||s[i]=='['||s[i]=='{') s1.push(s[i]); else if(s1.empty()) return false; else if((s[i]==')'&&s

栈的应用-判断括号匹配

栈的一个典型应用就是可以用来协助分析表达式的括号是否匹配.括号可以延伸到任何成对出现的界定符,例如引号,书名号等. 接下来给出程序实现: 第一部分给出的是堆栈的插入,删除等操作对应的实现: 1 public class StackChar 2 { 3 private int maxSize;//堆栈数组大小 4 private char [] stackArray; 5 private int top;//堆栈顶 6 public StackChar(int maxSize) 7 { 8 thi

rwkj 1378 stack(括号匹配)

C++:泛型编程stack(括号匹配)时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte总提交:72 测试通过:39 描述 假设表达式中包含一种括号:圆括号,其嵌套顺序随意,即(()())或(())等为正确的格式,)(或((())或())均为不正确的格式.检验括号是否匹配可以用堆栈来实现当遇到 ( 时进栈,遇到 ) 时出栈进行匹配检验,如果出现不匹配的情况立即结束,否则继续取下一个字符.如果没有遇到不匹配的情况,最后判断栈是否为空,栈为空,括号匹配,否则不

rwkj 1378 C++:泛型编程stack(括号匹配)

C++:泛型编程stack(括号匹配) 时间限制(普通/Java):1000MS/3000MS            运行内存限制:65536KByte 总提交:176            测试通过:88 描述 假设表达式中包含一种括号:圆括号,其嵌套顺序随意,即(()())或(())等为正确的格式,)(或((())或())均为不正确的格式.检验括号是否匹配可以用堆栈来实现当遇到 ( 时进栈,遇到 ) 时出栈进行匹配检验,如果出现不匹配的情况立即结束,否则继续取下一个字符.如果没有遇到不匹配的

详解括号匹配问题(STL stack)

1. 括号匹配的四种可能性: ①左右括号配对次序不正确 ②右括号多于左括号 ③左括号多于右括号 ④左右括号匹配正确 2. 算法思想: 1.顺序扫描算数表达式(表现为一个字符串),当遇到三种类型的左括号时候让该括号进栈: 2.当扫描到某一种类型的右括号时,比较当前栈顶元素是否与之匹配,若匹配,退栈继续判断: 3.若当前栈顶元素与当前扫描的括号不匹配,则左右括号配对次序不正确,匹配失败,直接退出: 4.若字符串当前为某种类型的右括号而堆栈已经空,则右括号多于左括号,匹配失败,直接退出: 5.字符串循

括号匹配的栈实现

括号匹配的栈实现 问题:判断一个文本中,括号是否匹配? 思路:从头到尾扫描字符串,每次遇到左括号(如'(', '[', '{')就压入堆栈,如果遇到右括号(如')', ']', '}')就与栈顶元素比较,如果成对,OK,否则判断不匹配. 代码如下: #include <iostream> #include <stack> #include <set> #include <string> using namespace std; /* * vaild retu

【数据结构】栈的应用——括号匹配问题

括号匹配问题: 给一个字符串,其中包含小括号.中括号.大括号,求该字符串中的括号是否匹配. 例如:()()[]{} 匹配([{()}]) 匹配[](               不匹配[(])              不匹配 利用堆栈的思路:建立一个堆栈,然后遍历字符串,如果是'(','{'.'[',则入栈,否则判断当前字符串和栈顶元素是否是一对括号:要注意的是,需要提前判断栈是否为空,为空的时候取top是违法的的,所以只要为空就入栈,然后执行下一次循环,而且,只要循环过程中出现一次栈顶元素和

nyoj 括号匹配

这个方程有两种形式,本文采用 if(s[i]=s[j]) dp[i][j]=d[i-1][j-1] dp[i][j]=min(dp[i][k]+dp[k+1][j],dp[i][j]) (i=<k<j) 其实与另一种方法比较:根据j的所有匹配情况取最小值 1.i到j无匹配,取为dp[i][j-1]+1 2.列举所有匹配情况 dp[i][k-1]+dp[k+1][j] 取上述所有情况最小值 两者都能获得正确的结果. 同时两者的初始化为 dp[i][j]==1 if(i==j) 规划方向为: