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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
括号匹配问题,比较经典,利用堆栈来实现(摘自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;
}

  

posted @   dapeng888  阅读(5475)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示