IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构 study 8:括号匹配的检验 -> 正文阅读

[数据结构与算法]数据结构 study 8:括号匹配的检验

检验括号是否匹配

检验括号匹配的方法,就是对给定的字符串依次检验:若是左括号,入栈;若是右括
号,出栈一个左括号判断是否与之相匹配;是其它字符,不检验。检验到字符串尾,还要
检查栈是否空。只有栈空,整个字符串才匹配完。

括号(()、[]和{})匹配的检验

在这里插入图片描述
请输入带括号(()、[]和{})的表达式
{[(5-2)*(7-3)+2]*4+8}*6

在这里插入图片描述

题目解析

(1)程序 提示 用户 ,手动输入 字符串

(2)对输入的字符串,逐个判断
如果是括号() [] {} ,包含 大括号,中括号,小括号
如果是左括号,就push到栈中,
如果是右括号,就从栈中pop出来。
看是否匹配,如果不匹配就报错。
(3)
在录入字符串时常使用到“gets”和“fgets”函数,但是两者都有一定的缺陷:

gets函数对录入的字符个数没有限制,容易造成越界
fgets函数会默认在字符串末尾加上"\n",影响数据的准确性

封装fgets函数,去掉其末尾的换行符"\n"
https://blog.csdn.net/qq_43968080/article/details/84862198

首先写基本程序

/* 对于输入的任意一个字符串,检验括号是否配对 */

/* c1.h (程序名) */
#include<string.h>
#include<ctype.h>
#include<malloc.h> /* malloc()等 */
#include<limits.h> /* INT_MAX等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<stdlib.h> /* atoi() */
#include <sys/io.h> /* eof() */
#include<math.h> /* floor(),ceil(),abs() */

#include<pthread.h> /* exit() */
/* 函数结果状态代码 */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
/* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */


typedef char ElemType; /* 定义栈元素类型为整型 */

/* c3-1.h 栈的顺序存储表示 */
#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
#define STACKINCREMENT 2 /* 存储空间分配增量 */



int main()
{
    ElemType array[160];
    int array_cnt = 0 ;
    int i ;

    ElemType ch ;
    ElemType tmp_ch ;

    ElemType contain[160];
    int contain_index = 0 ;
    printf("{1+()+(3+4+(5+6+6)+4+((((3+2)+3+(2+1)+((2+1+((+4+3)_+(22))))))))}\n");
    printf("请输入 带括号的表达式:eg: {122 + (10/5)*(2x6)}\n");

    memset(array,0,sizeof(array));
    
    gets(array);

    printf("输入内容为:%s\n",array);

    array_cnt = strlen(array);
    
    printf("输入长度为:%d\n",array_cnt);

    
    for(i=0;i< array_cnt;i++){

        ch = array[i];

        switch(ch){

            case '(':
            case '[':
            case '{':
                contain[contain_index] = ch ;
                contain_index++ ;
                break;
            
            case ')':
            case ']':
            case '}':
                if(contain_index >0){

                   tmp_ch= contain[--contain_index];

                   if(tmp_ch == '(' && ch == ')'){

                     printf("小括号匹配\n");
                   }
                   else if(tmp_ch == '[' && ch == ']'){
                    printf("中括号匹配\n");

                   }
                   else if(tmp_ch == '{' && ch == '}'){

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

                   }else{

                        printf("匹配错误\n");
                        return ERROR ;
                   }
                }
                
                break ;

        }
    }

    return 0;
}



遇到问题

warning: the `gets’ function is dangerous and should not be used
解决办法是使用 fgets
fgets()函数的基本用法为

fgets(char * s,int size,FILE * stream);
//eg:可以用fgets(tempstr,10,stdin)
//tempstr 为char[]变量,10为要输入的字符串长度,stdin为从标准终端输入。

示例程序

/*   代码实现     */

#include <stdio.h>
int main ( ) {

   char name[20];

   printf("\n 输入任意字符 : ");

   fgets(name, 20, stdin);//stdin 意思是键盘输入

   fputs(name, stdout); //stdout 输出

   return 0;
}

换成用栈的方式

/* 对于输入的任意一个字符串,检验括号是否配对 */

/* c1.h (程序名) */
#include<string.h>
#include<ctype.h>
#include<malloc.h> /* malloc()等 */
#include<limits.h> /* INT_MAX等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<stdlib.h> /* atoi() */
#include <sys/io.h> /* eof() */
#include<math.h> /* floor(),ceil(),abs() */

#include<pthread.h> /* exit() */
/* 函数结果状态代码 */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
/* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */


typedef char ElemType; /* 定义栈元素类型为整型 */

/* c3-1.h 栈的顺序存储表示 */
#define STACK_INIT_SIZE 60 /* 存储空间初始分配量 */
#define STACKINCREMENT 2 /* 存储空间分配增量 */


typedef struct sqStack{

    ElemType *base ;
    ElemType *top ;
    int stack_size ;

}sqStack;


Status init_stack(sqStack * S)
{
    S->base = (ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SIZE);

    S->top = S->base ;

    S->stack_size = STACK_INIT_SIZE ;

    return OK;
}


Status push_stack(sqStack *S, ElemType e)
{
    if(S->top - S->base < S->stack_size){

        *(S->top++) = e ;
        
        return OK ;
    }

    return ERROR;
}

Boolean empty_stack(sqStack *S)
{
    if(S->top == S->base){

        return TRUE;
    }

    return FALSE ;
}

Status pop_stack(sqStack *S, ElemType *e)
{

    if(!empty_stack(S)){

        *e = *(--(S->top));

        return OK;
    }

    return ERROR;
}



int main()
{
    ElemType array[160];
    int array_cnt = 0 ;
    int i ;

    ElemType ch ;
    ElemType tmp_ch ;

    sqStack S ;
    printf("{1+()+(3+4+(5+6+6)+4+((((3+2)+3+(2+1)+((2+1+((+4+3)_+(22))))))))}\n");
    printf("请输入 带括号的表达式:eg: {122 + (10/5)*(2x6)}\n");

    memset(array,0,sizeof(array));
    
    init_stack(&S);

    fgets(array,sizeof(array), stdin);
    
    char *find = strchr(array, '\n');  //找出data中的"\n"
    if(find)
        *find = '\0';   //替换    

    printf("输入内容为:%s\n",array);

    array_cnt = strlen(array);
    
    printf("输入长度为:%d\n",array_cnt);

    
    for(i=0;i< array_cnt;i++){

        ch = array[i];

        switch(ch){

            case '(':
            case '[':
            case '{':

                push_stack(&S,ch);

                break;
            
            case ')':
            case ']':
            case '}':
                
                if(pop_stack(&S,&tmp_ch) == OK){

                   if(tmp_ch == '(' && ch == ')'){

                     printf("小括号匹配\n");
                   }
                   else if(tmp_ch == '[' && ch == ']'){
                    printf("中括号匹配\n");

                   }
                   else if(tmp_ch == '{' && ch == '}'){

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

                   }else{

                        printf("匹配错误\n");
                        return ERROR ;
                   }                    
                }
                else{
                    
                        printf("栈为空,匹配错误\n");
                        return ERROR ;                                        
                }
                
            

                
                break ;

        }
    }

    return 0;
}



  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 12:21:37  更:2021-08-26 12:23:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 7:47:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计