数据结构13: 括号匹配算法及C语言实现

在编写代码的时候,经常会用到两种括号:圆括号 “()” 和大括号 “{}” 。不管使用哪种括号,程序编译没有问题的其中一个重要因素就是所使用的括号是否能够匹配上.

在编写程序时,括号可以嵌套,即: “({()})” 这种形式,但 “({)” 或者 “({}” 都不符合要求。

括号匹配项目要求:给出任意搭配的括号,判断是否匹配。

设计思路

编写程序判断括号匹配问题的时候,使用栈结构会很容易:

  • 如果碰到的是左圆括号或者左大括号,直接压栈;
  • 如果碰到的是右圆括号或者右大括号,就直接和栈顶元素配对:如果匹配,栈顶元素弹栈;反之,括号不匹配;

实现代码

#include <stdio.h>
#include <string.h>
int top = -1;  //top变量时刻表示栈顶元素所在位置
void push(char *a, int elem){
    a[++top] = elem;
}
void pop(char *a){
    if (top == -1)
        return ;
    top--;
}
char visit(char * a){
    //调取栈顶元素,不等于弹栈,如果栈为空,为使程序不发生错误,返回空字符
    if (top != -1)    {
        return a[top];
    }   else   {
        return ‘ ‘;
    }
}
int main() {
    char a[30];
    char bracket[100];
    printf("请输入括号序列:");
    scanf("%s", bracket);
    getchar();
    int length = (int)strlen(bracket);
    for (int i=0; i<length; i++)    {
        //如果是左括号,直接压栈
        if (bracket[i] == ‘(‘ || bracket[i] == ‘{‘)      {
            push(a, bracket[i]);
        }else{
            //如果是右边括号,判断与栈顶元素是否匹配,如果匹配,栈顶元素弹栈,程序继续运行;否则,发现括号不匹配,输出结果直接退出
            if (bracket[i] == ‘)‘)        {
                if (visit(a) == ‘(‘)           {
                    pop(a);
                }          else          {
                    printf("括号不匹配");
                    return 0;
                }
            }        else       {
                if (visit(a) == ‘{‘)           {
                    pop(a);
                }          else          {
                    printf("括号不匹配");
                    return 0;
                }
            }
        }
    }
    //如果所有括号匹配完成,栈内为空,说明所有括号全部匹配成功
    if (top != -1)    {
         printf("括号不匹配");
    }   else   {
         printf("括号匹配");
    }
}
运行结果:
请输入括号序列:{}(){
括号不匹配

原文地址:https://www.cnblogs.com/ciyeer/p/9031177.html

时间: 2024-10-12 23:53:02

数据结构13: 括号匹配算法及C语言实现的相关文章

Java堆栈的应用1----------堆栈的自定义实现以及括号匹配算法的Java实现

接下篇:http://www.cnblogs.com/fuck1/p/5995857.html 堆栈的应用1:括号匹配算法 括号匹配问题 假设算术表达式中包含圆括号,方括号,和花括号三种类型.使用栈数据结构编写一个算法判断表达式中括号是否正确匹配,并设计一个主函数测试. 比如:{a+[b+(c*a)/(d-e)]}     正确 ([a+b)-(c*e)]+{a+b}    错误 对于表达式中的括号是否匹配,不能仅仅通过统计左括号'('出现的次数和右括号')'出现的次数是否相等来实现,"a*)b

数据结构线性表链表的C语言实现

                                                                                      数据结构线性表链表的C语言实现      说明:线性表是一种最简单的线性结构,也是最基本的一种线性结构,所以它不仅是学习中的重点,也是应用开发非常常用的一种数据结构.它可以分为顺序表和链表.它的主要操作是数据元素的插入,删除,以及排序等.接下来,本篇文章将对线性表链表的基本操作和运用进行详细的说明(包含在源代码的注释中),并给

括号匹配算法

1.基于栈的应用 括号匹配算法是栈的一个典型应用:所以的借用栈来实现,保存相应的信息: 算法思想:遇到第一个字符, 判断栈空,字符入栈,其后的字符和栈顶元素进行比较,括号匹配的话,则栈顶元素出栈,否则,当前元素入栈,直到遇到0结束标志:最后根据栈空判断,空:括号匹配,否则,不匹配: 例:([{}])是匹配的括号,为正确的: 2.代码实现 #include<iostream> #include<stack> using namespace std; typedef unsigned 

【数据结构】之队列(Java语言描述)

在[这篇文章]中,我简单介绍了队列的基本数据结构及操作方式,并用C语言代码描述了队列的基本功能实现. JDK中默认为我们提供了队列的API-- Queue . Queue是一个接口,其中提供了处理队列及其操作的一些基本方法,如果我们想要创建自己的队列,就需要先创建一个类实现Queue接口. 在Java语言中也为我们提供了一些现成的Queue接口的实现类,如下: * @see java.util.Collection * @see LinkedList * @see PriorityQueue *

括号匹配算法求解(用栈实现)

1.括号匹配算法 //括号匹配算法 public void pipei()throws Exception{ char temp,ch; int match; //记录匹配结果 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ch=(char) br.read(); //输入一个字符 while(ch!='0'){ if(getTop()==-1){ push(ch); }else{ temp=p

数据结构--KMP模式匹配算法

今天,在看数据结构--串这一章节时,看到了KMP算法,相对较复杂些,在此单独做下整理. kmp算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特--莫里斯--普拉特操作(简称KMP算法).KMP算法的关键是根据给定的模式串W1,m,定义一个next函数.next函数包含了模式串本身局部匹配的信息. 例子: 假如我们要比较两个字符串是否相等. 在T串中查找S串.我们用最笨的方法去想,就是将T串与S串中的每一个元素一一去匹配,

括号匹配算法 C语言实现

#include <stdio.h> #include <malloc.h> //malloc,realloc #include <math.h> //含有overflow #include <process.h> //exit() #define S_SIZE 100 //栈的空间大小 #define STACKINCREAMENT 10//增加空间 struct SqStack{ int *base; //栈底 int *top; //栈顶 int st

C语言实现 数据结构-栈-括号匹配

题目描述 假设一个表达式有英文字母(小写).运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”:否则返回“NO”.假设表达式长度小于255,左圆括号少于20个. 输入 一行字符串 输出 YES或者NO 样例输入 ((1+b)-(a+3))*[email protected] 样例输出 YES 样例输入 (25+x)*(a*(a+b+b)@ 样例输出 NO 算法实现:1.利用栈来实现只需要考虑输入的是

不使用栈简单实现括号匹配算法

刚刚做数据结构作业时有这样一道书本习题,题目如下: 3.2 假设以I和O分别表示进栈和出栈操作,栈的初态和终栈均为空,进栈和出栈的操作序列可表示为仅由I和O组成的序列. (1)下面所示的序列中哪些是合法的? A. IOIIOIOO B. IOOIOIIO C. IIIOIOIO D. IIIOOIOO (2)通过对(1)的分析,写出一个算法判定所给的操作序列是否合法.若合法则返回1:否则返回0.(假设被判定的操作序列已存入一位数组中). 第一题思考了一下,AD 第二题本来想用栈来做,但似乎又没有