精华内容
下载资源
问答
  • c语言实现括号匹配算法
    2021-05-20 09:05:07

    /*括号匹配算法*/

    #include

    #define FALSE 0

    #define TRUE 1

    #define MAXSIZE 100

    typedef char DataType;

    //定义栈

    typedef struct stack{

    DataType data[MAXSIZE];

    int top;

    }SeqStack;

    //初始化栈

    void InitStack(SeqStack *s)

    {

    s->top = -1;

    }

    //判断栈是否为空

    int IsEmpty(SeqStack *s)

    {

    if(s->top == -1)

    return TRUE;

    return FALSE;

    }

    //判断栈是否已满

    int IsFull(SeqStack *s)

    {

    if(s->top == MAXSIZE-1)

    return TRUE;

    return FALSE;

    }

    //出栈

    void PopStack(SeqStack *s, DataType temp)

    {

    if(IsEmpty(s))

    return;

    temp = s->data[s->top];

    s->top --;

    }

    //压栈

    void PushStack(SeqStack *s,DataType temp)

    {

    if(IsFull(s))

    return;

    s->top ++ ;

    s->data[s->top]=temp;

    }

    //判断两个括号是否匹配

    int Match(char chone,char chtwo)

    {

    if(chone=='(' && chtwo==')')

    return TRUE;

    else if(chone == '{' && chtwo == '}')

    return TRUE;

    else if(chone == '[' && chtwo == ']')

    return TRUE;

    else

    return FALSE;

    }

    //取栈顶元素

    void GetTopStack(SeqStack *s , DataType *temp)

    {

    if(IsEmpty(s))

    return;

    *temp = s->data[s->top];

    }

    void BracketMatch(char *str)

    {

    SeqStack s;

    int i;

    char ch;

    InitStack(&s);

    for(i=0 ; str[i]!='\0';i++ )

    {

    switch(str[i]){

    case '(':

    case '[':

    case '{':

    PushStack(&s,str[i]);

    break;

    case ')':

    case ']':

    case '}':

    if(IsEmpty(&s))

    {

    printf("右括号多余\n");

    return;

    }else{

    GetTopStack(&s,&ch);

    if(Match(ch,str[i]))

    PopStack(&s,ch);

    else{

    printf("\n对应的右括号不同类\n");

    return;

    }/*if*/

    }/*else*/

    }/*for*/

    }/*switch*/

    if(IsEmpty(&s))

    printf("\n括号匹配\n");

    else

    printf("\n左括号多余\n");

    }

    int main()

    {

    char str[MAXSIZE];

    int i;

    printf("Input the bracket string: \n");

    scanf("%s",str);

    BracketMatch(str);

    return 1;

    }

    更多相关内容
  • 括号匹配C语言

    2018-12-05 20:55:34
    3利用栈的操作实现括号匹配的检验。 .括号匹配算法思想 (1)出现的凡是“左括号”,则进栈; (2)出现的是“右括号”, 首先检查栈是否空? 若栈空,则表明该“右括号”多余 否则和栈顶元素比较? 若相...
  • C语言验证括号匹配

    2018-03-30 18:07:27
    c语言下,利用栈的结构,判断一个表达式的括号是否合法
  • C语言实现括号匹配

    2021-11-22 20:56:45
    学过数据结构的同学应该很清楚,这个用栈这种数据结构就很容易达到目的,当然其他方式也行,这里我主要介绍使用栈完成括号匹配的方法 /*以下为Bracket1函数,可以处理三种括号匹配,请补充完整程序*/ int Bracket1...

    总体思路:最里面的左括号与最右边的同类型右括号始终为一对,从最左边的左括号开始依次向两边的括号进行比较便达到匹配括号的目的
    学过数据结构的同学应该很清楚,这个用(先进栈的元素先出栈)这种数据结构就很容易达到目的,当然其他方式也行,这里我主要介绍使用栈完成括号匹配的方法

    
    /*以下为Bracket1函数,可以处理三种括号匹配,请补充完整程序*/
    //关于栈的相关方法在文章末尾
    int Bracket1(char *str )
    
    {
    	/*以下填写正确的程序段*/
    	Sqstack S;
    	int a;
    	Initstack(&S);
    	fgets(str, 256, stdin);//该函数充键盘输入最多256个字符,并存入str所指向的字符串中
    	int k = strlen(str);
    	for (int i = 0; i <k ; i++)
    	{
    		char ch = str[i];
    		ElemType target;
    		switch (ch) {
    		case'{':
    		case'[':
    		case '(':
    			a = ch;
    			Push(&S,&a);
    			break;
    
    		case ')':
    			Pop(&S, &target);
    			if (target != '(') {
    				//printf("匹配失败!!!字符串中缺少%d位置%c的另一半!!",i,ch);
    				return 0;
    			}
    			break;
    		case '}':
    			Pop(&S, &target);
    			if (target != '{') {
    				//printf("匹配失败!!!字符串中缺少%d位置%c的另一半!!", i, ch);
    				return 0 ;
    			}
    			break;
    		case']':
    			Pop(&S, &target);
    			if (target != '[') {
    				//printf("匹配失败!!!字符串中缺少%d位置%c的另一半!!", i, ch);
    				return 0; 
    			}
    			break;
    
    		}
    
    	}
    	return StackEmpty(&S);
    	/*填写结束*/
    }
    

    栈的顺序存储方式(数组实现)的动态结构:

    typedef int ElemType;
    typedef struct stack
    {
    	 int maxSize;//栈的最大容量,
     	 ElemType *data;
    	 int top;//top指针失踪指向该栈data的顶部
    }Sqstack;
    

    栈的顺序存储方式的静态结构:

    typedef int ElemType;
    typedef struct stack
    {
    	 int maxSize;
     	 ElemType data[maxSize];
    	 int top;//top指针失踪指向该数组data的顶部
    }Sqstack;
    

    栈的链式存储结构

    typedef int ElemType;
    typedef struct stack
    {
    	 struct stack* next;//指向下一个节点的指针
     	 ElemType data;
    	 //如果使用链式存储结构,那么表头节点便是指向栈顶的指针
    }LinkStack;
    
    

    这里用到的相关方法(以顺序存储结构为例):

    
    int Push(Sqstack *L,ElemType *e)   /*元素*e进栈,进栈成功,函数返回1*/
    {
      /*以下插入正确的代码*/
      if(L->top == L->maxSize){
        int k = sizeof(ElemType);
    	L->data = realloc(L->data,2*k*L->maxSize);//如过元素溢出,使栈的容量扩大一倍
    	L->maxSize =2*L->maxSize; 
    	}
    	L->data[L->top] = *e;
    	L->top++;
      /*代码插入结束*/
      return 1;
    }
    
    int Pop(Sqstack *L,ElemType *e)  /*从栈顶出栈一个元素,并存在*e中,成功返回1*/
    {
      /*以下插入正确的代码*/
    	if (L->top == 0) {
    		printf("栈已为空!!\n");
    		return 0;
    	}
    	*e = L->data[--L->top];
      /*代码插入结束*/
      return 1;
    }
    
    展开全文
  • C语言之括号匹配

    2016-01-15 16:21:00
    括号匹配简单实用,尤其在编译器处理程序格式(括号是否匹配)问题上发挥突出作用。

    下面是本人括号匹配的代码,希望对你有用

    #include <stdio.h>
    #include <stdlib.h>
    #include<conio.h>
    #include<malloc.h>
    #define OVERFLOW 0
    #define ERROR 0
    #define OK 1
    #define STACKSIZE 100
    #define STACKINCREMENT 50
    #define OVERFLOW 0
    typedef struct
    {
        char *top;
        char *base;
        int stacksize;
    }sqstack;


    int initstack(sqstack *s)
    {
        s->base=(char*)malloc(STACKSIZE*sizeof(char));
        if(!s->base){exit(OVERFLOW);}
        s->top=s->base;//->表示的是内容
        s->stacksize=STACKSIZE;
        return OK;
    }


    int gettop(sqstack s,char *e)
    {
        if(s.top==s.base) return OK;
        *e=*(s.top-1);//使用top或base用的是“.”,表示指针
        return OK;


    }
    int push(sqstack *s,char e)
    {
        if(s->top-s->base>=s->stacksize)
        {
            s->base=(char*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(char));
            if(!s->base){exit(OVERFLOW);}//分配不成功,进入exit
            s->stacksize+=STACKINCREMENT;
            s->top=s->base+s->stacksize;
        }
        *s->top++=e;
        return OK;
    }


    int pop(sqstack *s,char *e)
    {
        if(s->top==s->base) return ERROR;
        *e=*--s->top;
        return OK;
    }
    int stackdestory(sqstack *s)
    {
        free(s->base);
        s->base=NULL;
        return OK;
    }


    int stackempty(sqstack s)
    {
        if(s.base==s.top)//表示栈空
           return OK;
        else
           return ERROR;
    }
    /*
    转载请注明出处:去转盘网www.quzhuanpan.com
    */
    int main(void)
    {
        int flag=1;
        char e,ch;
        sqstack s;
        initstack(&s);
        //方法,如果没有不匹配的情形,则一直输入,flag=1,打印匹配
        //不批配分两种1:一开始就不配,flag=0,不打印
        //2:之后有一次不匹配了
        // 匹配的话待在栈中,否则出来,flag=0
        do
        {
            scanf("%c",&ch);
            switch(ch)
            {
                case'{':
                case'[':
                case'(':push(&s,ch);break;
                case'}':if(stackempty(s)) flag=0;//如果栈空,那么肯定不匹配,因为被消
                       else if(pop(&s,&e)&&e!='{')
                        {
                            flag=0;// 如果是“{”,则不删,否则删,删则肯定不匹配,flag=0
                        }
                        break;
                case']':if(stackempty(s)) flag=0;
                        else if( pop(&s,&e)&&e!='[')
                        {
                           flag=0;
                        }
                        break;
                 case')':if(stackempty(s)) flag=0;
                        else if(pop(&s,&e)&&e!='(')
                         {
                             flag=0;
                         }
                         break;
                }
        }while(ch!='#'&&flag);
       if(!stackempty(s)) flag=0;// 如果空,则定不匹配,则flag=0,注意空为真!
       if(flag) printf("匹配");
       else printf("不匹配");
       stackdestory(&s);
       return 0;
    }
    /*
    转载请注明出处:去转盘网www.quzhuanpan.com
    */
    //备注realloc的原型
    //void*   mrealloc(void   *old_mem_ptr,int   new_size)
    //{
     //return   realloc(old_mem_ptr,new_size); 返回空
    //}

    展开全文
  • 详细解释括号匹配算法,并用C语言实现

    问题概述

    检测括号是否成对出现
    在这里插入图片描述
    最后出现的左括号最先匹配(LIFO),和栈的后进先出异曲同工
    在这里插入图片描述
    每出现一个右括号,就抵消(出栈操作)掉一个左括号

    算法思路

    • 遇到左括号就入栈
    • 遇到有括号,就抵消一个左括号

    不匹配的情况

    • 遇到一个右括号,栈内弹出的左括号与之不匹配,例如 此时的右括号是 ] 而栈内的左括号是 {
    • 匹配到最后一个括号。栈内已经空了,说明此时多出来了括号
    • 处理完所有括号,栈内非空

    实现流程图

    在这里插入图片描述

    C语言代码

    匹配代码实现代码

    bool bracketCheck(char str[],int length){
    	SqStack S;
    	InitStack(&S); //初始化栈
    	for(int i=0;i<length;i++){
    		if(str[i]=='('||str[i]=='{'||str[i]=='['){
    			Push(&S,str[i]); //扫描到左括号就入栈
    		}else{
    			if(IsEmpty(S)){ //扫描到右括号,当前栈为空,即右括号单身情况
    				return false; //匹配失败
    			}
    			char topElem; //用来保存弹出栈的栈顶元素
    			Pop(&S,&topElem); //栈顶元素出栈
    			if(str[i]==')'&&topElem!='('){
    				return false;
    			}
    			if(str[i]=='}'&&topElem!='{'){
    				return false;
    			}
    			if(str[i]==']'&&topElem!='['){
    				return false;
    			}
    		}
    	}
    	return IsEmpty(S);
    }
    

    完整代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <string.h>
    #define MaxSize 100 //定义栈中元素最大个数
    
    typedef struct{
    	char data[MaxSize];
    	int top;
    }SqStack;
    
    //初始化栈
    void InitStack(SqStack *S){
    	S->top = -1;
    }
    //判断栈是否为空
    bool IsEmpty(SqStack S){
    	if(S.top == -1){
    		return true;
    	}
    	return false;
    }
    //新元素入栈
    void Push(SqStack *S,char x){
    	if(S->top == MaxSize-1){
    		printf("栈已满"); //栈已满
    		return;
    	}
    	S->top += 1;
    	S->data[S->top] = x;
    }
    //栈顶元素出栈,用x返回
    void Pop(SqStack *S,char *x){
    	if(S->top == -1){
    		printf("栈已满");
    		return;
    	}
    	*x = S->data[S->top];
    	S->top -= 1;
    }
    //匹配算法
    bool bracketCheck(char str[],int length){
    	SqStack S;
    	InitStack(&S); //初始化栈
    	for(int i=0;i<length;i++){
    		if(str[i]=='('||str[i]=='{'||str[i]=='['){
    			Push(&S,str[i]); //扫描到左括号就入栈
    		}else{
    			if(IsEmpty(S)){ //扫描到右括号,当前栈为空,即右括号单身情况
    				return false; //匹配失败
    			}
    			char topElem; //用来保存弹出栈的栈顶元素
    			Pop(&S,&topElem); //栈顶元素出栈
    			if(str[i]==')'&&topElem!='('){
    				return false;
    			}
    			if(str[i]=='}'&&topElem!='{'){
    				return false;
    			}
    			if(str[i]==']'&&topElem!='['){
    				return false;
    			}
    		}
    	}
    	return IsEmpty(S);
    }
    int main(){
    	char s[MaxSize];
    	printf("请输入需要判断的括号:\n");
    	scanf("%s",s);
    	int len = strlen(s);
    	printf("当前输入的括号个数为:%d\n",len);
    	printf("--------现在开始进行判断--------\n");
    	if(bracketCheck(s,len)){
    		printf("匹配成功!");
    	}else{
    		printf("匹配失败!");
    	}
    	return 0;
    }
    
    

    结果测试

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • C语言括号匹配算法

    2021-09-17 10:58:42
    1、C语言括号匹配算法 一起加油兄弟姐妹们!!!冲冲冲 /** * 思想很简单就是左括号进栈,遇到右括号的时候,就把栈顶元素取出,然后匹配,然后对结果进行不用的处理 * 括号匹配算法: * 匹配失败的可能: ...
  • 2、假设一个算术表达式中可以包含三种括号:园括号“(”和“)”、方括号“[”和“]”、花括号“{”和“}”,且这三种括号可按任意的次序嵌套使用。编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式...
  • 数据结构 严蔚敏 C语言括号匹配 while((c = getchar()) != EOF) { switch(c) { case '[': push(&sqSta;, c); break; case '(': push(&sqSta;, c); break; case ']': if(getTop(&sqSta;, &e)) { if...
  • C语言实现表达式括号匹配算法及程序
  • c语言实现括号匹配检测

    千次阅读 2019-11-10 15:00:37
    c语言实现括号匹配检测 #include<stdio.h> #include<iostream> #include<string> typedef struct bracketStack { char data; bracketStack* next; int quenesize; //初始化函数 void ...
  • 用一个栈,就能解决该问题,左括号栈顶字符必须和第一个入栈的右括号字符匹配。 栈介绍:栈是一种特殊的线性表,仅能在线性表的一端操作。 栈的特性:后进先出(LIFO) 由于正在学数据结构,于是栈的定义与操作都是...
  • 我们在编写程序的时候经常会遇到括号不匹配而导致语法错误的问题,现在我们可以通过栈来自己实现括号匹配的问题,了解其实现细节。 我们假设在表达式中只有()[]这两种括号,其嵌套的方式是随意的。检验括号是否匹配...
  • 1要求编写程序检查该字符串...2分析用一个栈,就能解决该问题,左括号栈顶字符必须和第一个入栈的右括号字符匹配。 栈介绍:栈是一种特殊的线性表,仅能在线性表的一端操作。 栈的特性:后进先出(LIFO) 由于正在学数...
  • c语言实现括号匹配的检验问题 #include<stdio.h> #define maxsize 8 int match() { int stack[maxsize]; int top=-1; char str[256]; gets(str); int i=0; while(str[i]!=’\0’) { if(str[i]=’(’ || str[i]...
  • 前言 在我自己学习的过程中,难免会遇到许多复杂的算法问题。解决问题的一个好方法就是查找资料、参考别人的逻辑思维。而有一些问题是查找不到的,也...再比如说,我们输入了{[}]这串括号组,显然,这是一个错误的括号
  • C语言括号匹配问题

    万次阅读 2019-03-06 15:27:10
    功能:可进行括号匹配,输入可包括{}, [], (), 其他任意字符 输入示例: 3 {{{{{{{[[[[[1314]]]]]}}}}}}} {{{{{[[[(())]}}}}} ((({{{{{[[521]]}}}}}))) 输出示例: Yes No Yes Auth...
  • #include#define Stack_size 10000typedef struct{char elem[Stack_size];int top;} SeqStack;void InitStack (SeqStack *S) {S->top = -1;}int IsEmpty (SeqStack *S) {if (S->top == -1) return 1;...
  • C语言括号匹配

    千次阅读 2020-05-16 16:10:02
    给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查...思路:题目输入一些字符串,我们就先保留括号之类的,判断是否匹配。如果遇到左括号,就入栈,如果遇到一个右括号,就与栈顶元
  • 问题标题数据结构C语言括号的检验源程序 , 数据结构(C) 请用类C语言实现括号匹配的检验这个算法2019-8-21来自ip:13.149.196.77的网友咨询浏览量:270手机版问题补充:数据结构C语言括号的检验源程序 , 数据结构(C) 请...
  • c语言括号匹配问题的一种解法。
  • 括号匹配C语言实现

    千次阅读 2021-04-02 10:49:13
    若你掌握以下知识,你可以更好地理解此...括号匹配有点像俄罗斯方块,或者消消乐,怎么说呢,我给大家用图演示一个过程就知道了 1.首先准备一个数组装要匹配的括号们,再准备一个栈。 2.然后把数组内第一个括号丢入栈
  • C语言实现栈的括号匹配

    千次阅读 2021-04-22 18:15:50
    二、方便起见,这里我们使用栈的顺序存储结构来存储待匹配的元素: 因为存储的是括号,所以数据部分是char类型。 我们开辟了10个连续的char型空间存储元素,1个Int型空间存储指针,指针的值为数组下标。 #include<...
  • c语言实现括号匹配,使用堆栈-链表实现基础结构实现1.堆栈结构体与数据类型2.初始化栈3.栈的基本方法4.括号匹配方法及其代码全部代码 基础结构实现 1.堆栈结构体与数据类型 #define MAXSIZE 100 typedef char ...
  • 用栈实现括号匹配: 依次扫描所有字符,遇到左括号入栈,遇到右括号则弹出栈顶元素检查是否匹配。 匹配失败的情况: 左括号单身 右括号单身 左右括号不匹配 二、例题 给定一个只包括 '(',')','{','}','[',']'...
  • } } } } if(isEmpty(&s)) { printf("\n括号匹配"); } else printf("\n左括号多余"); } int main(){ char str[100], enter,ch; seqstack s; initStack(&s); printf("请输入字符串:\n"); scanf("%s",str); scanf("%c...
  • 检验大括号{}和小括号()匹配
  • C语言数组实现括号匹配 废话不多说,直接上代码 #include<iostream> using namespace std; int Match(char *str) { char s[100]; //定义顺序栈,假定最长有效字符为100 int top = -1; //初值指针-1 for(int...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,703
精华内容 17,081
关键字:

C语言之括号匹配