数据结构-栈的实现之括号匹配检测

假设表达式中只允许两种括号:()、{};
正确表达顺序为:()或{}或({})或{({}{})}的形势;如{(}或(})或({)}的表达形势均不对。
算法的设计思想:

  出现左括弧则进栈;

  出现右括弧则首先检测栈是否为空,

    若栈空则表明此右括弧多余,表达式不匹配。

    否则和栈顶数据比较,若匹配则栈顶出栈。

      否则表明表达式不匹配;

  最后若栈空且没有做鱼右括弧则匹配正确,否则表明不匹配。

实现代码如下(Stack.h头文件为之前写的数据结构-栈的顺序结构中写的数组那个方法,用到了里面栈的结构和连个基本栈操作)

 1 void Matching(char e[])
 2 {
 3     Stack S;
 4     InitStack(S);
 5     unsigned int i = 0, state = 1;
 6     char z;
 7     while((int)(i <= strlen(e)) && state && e[i] != ‘\0‘)    //结束条件 超出数组长度或state为0或字符串结束
 8     {
 9         switch(e[i])
10         {
11         case ‘(‘:
12         case ‘{‘:
13             Push(S,e[i]);    //遇到({则进栈
14             i++;
15             break;
16         case ‘)‘:
17             GetTop(S,z);
18             if(!StackEmpty(S) && z == ‘(‘)    //遇到)则判断栈顶是不是(,是的话出栈,不是则不匹配
19             {
20                 Pop(S,z);
21                 i++;
22             }
23             else
24                 state = 0;
25             break;
26         case ‘}‘:
27             GetTop(S,z);
28             if(!StackEmpty(S) && z == ‘{‘)//遇到}则判断栈顶是不是{,是则出栈,不是则不匹配
29             {
30                 Pop(S,z);
31                 i++;
32             }
33             else
34                 state = 0;
35             break;
36         }
37     }
38     if(StackEmpty(S) && state)    //空栈且state不为0则全部匹配
39         printf("括号全部匹配");
40     else
41         printf("括号不匹配");
42 }

主函数测试代码如下:

1 void main()
2 {
3     char e[20];
4     printf("请输入括号:");
5     scanf("%s",e);
6     Matching(e);
7 }

测试只要输入表达式格式正确,则匹配结果是正确的。

时间: 2024-08-07 04:09:36

数据结构-栈的实现之括号匹配检测的相关文章

华为上机练习题--括号匹配检测

题目: 输入一串字符串,其中有普通的字符与括号组成(包括'('.')'.'[',']'),要求验证括号是否匹配,如果匹配则输出0.否则输出1. Smple input:dfa(sdf)df[dfds(dfd)]    Smple outPut:0 分析: 类似于括号字符匹配这类的问题, 我们可以模拟栈的操作来进行验证, 这样问题就简单了, 就是栈的操作 代码如下: package com.wenj.test; import java.util.ArrayList; import java.uti

栈应用——最长括号匹配

问题描述: 给定字符串,仅包含左括号'('和右括号')',它可能不是括号匹配的,设计算法,找出最长的括号字串,并返回字串的长度. 如: ((): 2 ()(): 4 ()(()):6 (()()): 6 思路分析: 记起始位置start = -1,最大匹配长度为max 考虑当前位置i的符号: 如果是'(',直接入栈: 如果是')': 如果栈空,则起始位置更新为i; 如果栈不空,则肯定能与栈顶的左括号匹配,然后考虑弹出一个左括号后的栈: 若栈空,则说明此次是一个匹配,匹配长度为:i-start,然

C++括号匹配检测(用栈)

输入一串括号,包括圆括号和方括号,()[],判断是否匹配,即([]())或[([][])]为匹配的正确的格式,[(])或([())为不匹配的格式. #include<iostream>#include<string>#include<stack>using namespace std;int main(){ string str; getline(cin,str); stack<char>s; for(int i=0;i<str.size();i++)

数据结构(C语言) 栈的应用之括号匹配

#include<stdio.h> #include<stdlib.h> typedef struct SqStack { char str[100]; int top; }SqStack; void Push(SqStack* S, char c) { S->top++; S->str[S->top] = c; } void Pop(SqStack* S, char* c) { *c = S->str[S->top]; S->top--; }

栈的应用-判断括号匹配

栈的一个典型应用就是可以用来协助分析表达式的括号是否匹配.括号可以延伸到任何成对出现的界定符,例如引号,书名号等. 接下来给出程序实现: 第一部分给出的是堆栈的插入,删除等操作对应的实现: 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

栈的应用之括号匹配的检验

栈的实际应用很多,其中括号匹配是很常见的例子.下面列出基本算法和源代码,标明注释以便日后复习和翻阅. Description: 利用栈编写满足下列要求的括号匹配检验程序:假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的 顺序随意,即([]())或[([][])]等为正确的格式,[(]或([())或(()])均为不正确的格式.输入一个包含上 述括号的表达式,检验括号是否配对.本题给出部分check()函数,要求将check()函数补充完整,并完成 整个程序. 算法: 代码: 1 void c

顺序栈(进制转换 + 括号匹配 + 判断栈表 + 最长括号匹配长度)

#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define STACK_INIT_SIZE 100 #define STACKLINCREMENT 10

栈的应用之括号匹配

思路: 在算法中设置一个栈,每读入一个空号 一:若是右括号: '}'  ' )'   ']'(两种情况): 1:使置于栈顶的最急迫的期待得以消解,需将栈顶元素出栈: 2:不合法的情况,即与栈顶的最急迫的期待不匹配,需将其(括号)压栈: 二:若是左括号:'('  '{'  '[' 作为一个新的更急迫的期待压栈: 顺序栈的代码不再赘述:点击打开链接 //括号匹配 #include"stack.h" int main() { Stack st; InitStack(&st); int

java版括号匹配检测

做一个空栈,读入字符直到结尾.如果读入一个封闭符号,空栈时报错;非空时弹出栈尾字符,如果不匹配则报错.否则读入为开放字符,压入栈中.最后如果栈空,返回true. 其中用到MyStack类,详情请见 1 public class KuohaoJiancha { 2 private char [] item = {'(',')','[',']','{','}'}; 3 private MyStack stack = new MyStack(); 4 private char[] str; 5 pri