括号匹配(c语言实现)
1要求
编写程序检查该字符串的括号是否成对出现,而且不能交叉出现。
输入:
一个字符串,里边可能包含“()”、"{}"、“[]”三种括号,“#”结束
输出:
成功:代表括号成对出现并且嵌套正确
失败:未正确使用括号字符。
2分析
用一个栈,就能解决该问题,左括号栈顶字符必须和第一个入栈的右括号字符匹配。
栈介绍:栈是一种特殊的线性表,仅能在线性表的一端操作。
栈的特性:后进先出(LIFO)
由于正在学数据结构,于是栈的定义与操作都是自己编写的,为了巩固概念
3代码
#include<stdio.h>
#include <malloc.h>
#define STACK_INT_SIZE 100
#define STACKINCREMENT 10
#define bool int //自定义bool变量
#define SElemType char
typedef struct {
SElemType *base; //栈基地址
SElemType *top; //栈顶地址
int stacksize;
} SqStack;
//------基本操作的算法描述------
//构建一个空栈
bool InitStack(SqStack *S) {
S->base = (SElemType *) malloc(STACK_INT_SIZE * sizeof(SElemType)); //开辟新的空间
if (!S->base) return 0; //开辟失败返回0
S->top = S->base;
S->stacksize = STACK_INT_SIZE;
return 1;
}
//若栈不为空,返回栈顶元素,并返回true 否则返回 false
bool GetTop(SqStack S) {
if (S.top == S.base) return 0;
return *(S.top - 1);
}
//插入元素 为新的栈顶元素
bool Push(SqStack *S, SElemType e) {
if (S->top - S->base >= S->stacksize) //如果栈满 需要增加空间
{
S->base = (SElemType *) realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
if (!S->base) return 0;
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*(S->top++) = e;
return 1;
}
//若栈不为空,则删除栈顶元素,用e返回其值,返回true, 否则返回false
bool Pop(SqStack *S, SElemType *e) {
if (S->top == S->base) return 0;
*e = *(--S->top);
return 1;
}
//检查括号字符在字符集中的位置
int CheckChar(char c, char OP[]) {
int i;
for (i = 0; i < 3; i++)
if (c == OP[i])return i;
return 999;
}
int main() {
SqStack OPTR;
InitStack(&OPTR);
Push(&OPTR, '#');
printf("输入括号以“#”结尾\n");
char c;
c = getchar();
int m = 1; //判断最终是否完全匹配 完全匹配 值为1,否则为0
char OP1[] = {'[', '(', '{'}; //前置括号字符集
char OP2[] = {']', ')', '}'}; //后置括号字符集
while (c != '#') {
if (CheckChar(c, OP1) < 3) {
Push(&OPTR, c);
c = getchar();
} else {
if (CheckChar(GetTop(OPTR), OP1) == CheckChar(c, OP2)) {
//如果需要检验的两个符号在前置和后置括号集中的位置相同则表示配对成功
//例如[和],[在前置括号集中的位置1,]在后置括号集中的位置1,所以匹配成功
Pop(&OPTR, &c);
c = getchar();
continue;
} else {
m = 0;
break;
}
}
}
if (GetTop(OPTR) != c)m = 0;
if (m == 1)printf("\n括号完全匹配!");
else printf("\n括号匹配失败!");
return 0;
}
遇到此类问题,但看了文章还是未解决,
评论或加 QQ:781378815
括号匹配(c语言实现)的更多相关文章
- P1739_表达式括号匹配(JAVA语言)
思路:刚开始想用stack,遇到'('就push,遇到')'就pop,后来发现其实我们只需要用到栈里'('的个数,所以我们用一个变量统计'('的个数就好啦~ 题目描述 假设一个表达式有英文字母(小写) ...
- C语言数据结构之栈:括号匹配
括号匹配这是个很简单的题目,如果只有小括号,就模拟进栈和出栈的过程就行了: 注:输入时'@'作为结束标志 #include <stdio.h> int main() { freopen(& ...
- 一起talk C栗子吧(第二十回:C语言实例--括号匹配)
各位看官们,大家好.前几回中咱们说了堆栈的原理,而且举了实际的样例进行讲解,这一回咱们说的例 子是:括号匹配. 括号匹配使用了堆栈的原理,大家能够从样例看出来.所以我们把它们放在一起.闲话 休提.言归 ...
- C++学习(三十一)(C语言部分)之 栈和队列(括号匹配示例)
括号匹配测试代码笔记如下: #include<stdio.h> #include<string.h> #include <stdlib.h> #define SIZ ...
- 括号匹配性检测C语言实现
#include <stdio.h> #define SIMPLE_KUOHAO "(()1231qeqw)(@#$)" #define COMPLEX_KUOHAO ...
- 利用栈实现括号匹配(python语言)
原理: 右括号总是与最近的左括号匹配 --- 栈的后进先出 从左往右遍历字符串,遇到左括号就入栈,遇到右括号时,就出栈一个元素与其配对 当栈为空时,遇到右括号,则此右括号无与之匹配的左括号 当最终右括 ...
- 华为笔试题--LISP括号匹配 解析及源码实现
在17年校招中3道题目AC却无缘华为面试,大概是华为和东华互不待见吧!分享一道华为笔试原题,共同进步! ************************************************ ...
- 利用顺序栈解决括号匹配问题(c++)-- 数据结构
题目: 7-1 括号匹配 (30 分) 给定一串字符,不超过100个字符,可能包括括号.数字.字母.标点符号.空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入格式: 输入在一行 ...
- DP_括号匹配序列问题
括号匹配问题 简单括号匹配问题是给出字符串,判断字符串中的括号是否匹配,此类问题核心解决方案就是利用栈的后进先出的特性,从左到右依次遍历字符串,遇左括号进栈,遇右括号将其与栈顶元素配对,若能配对,则栈 ...
随机推荐
- tesseract4.0:win10 +x64+vs2015 源码安装(ViewerDebugging)安装记录
参考文章: https://blog.csdn.net/u013985291/article/details/78295789 https://blog.csdn.net/u013985291/art ...
- 【码上开心】Windows环境mysql数据库使用(一) 安装Mysql数据库
[下载MySql] https://dev.mysql.com/downloads/mysql/ 如下图,选择版本,本教程仅演示ZIP压缩包下载配置. 2.[解压到指定目录] 3.[配置环境变量] 4 ...
- Liunx学习总结(六)--进程
进程概述 简单来讲程序是一个包含可以执行代码的静态的文件.进程是一个开始执行但是还没有结束的程序的实例.当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作 ...
- JavaScript 数据结构与算法之美 - 你可能真的不懂递归
1. 前言 算法为王. 排序算法博大精深,前辈们用了数年甚至一辈子的心血研究出来的算法,更值得我们学习与推敲. 因为之后要讲有内容和算法,其代码的实现都要用到递归,所以,搞懂递归非常重要. 2. 定义 ...
- 分布式唯一ID生成算法-雪花算法
在我们的工作中,数据库某些表的字段会用到唯一的,趋势递增的订单编号,我们将介绍两种方法,一种是传统的采用随机数生成的方式,另外一种是采用当前比较流行的“分布式唯一ID生成算法-雪花算法”来实现. 一. ...
- [python]专用下划线标识符
1. python用下划线作为变量前缀和后缀,来指定特殊变量. _xxx: 不用'from module import *'导入,一般被看作是私有的,在模块或类外不可用使用. __xxx__: 系统定 ...
- CodeForces Round#480 div3 第2场
这次div3比上次多一道, 也加了半小时, 说区分不出1600以上的水平.(我也不清楚). A. Remove Duplicates 题意:给你一个数组,删除这个数组中相同的元素, 并且保留右边的元素 ...
- CF999C Alphabetic Removals 思维 第六道 水题
Alphabetic Removals time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- kmp算法学习 与 传参试验(常回来看看)
之前在codeforces上做了一道类似KMP的题目,但由于之前没有好好掌握,现在又基本忘记,并没能解答.下面是对KMP算法的一点小总结. 首先KMP算法的核心是纸在匹配过程中,利用模式串的前后缀来加 ...
- HTML5基本介绍
HTML5简介 HTML是互联网上应用最广泛的标记语言.HTML文件就是普通文本+HTML标记,而不同的HTML标记能表示不同的效果.(简单的说HTML是超文本标记语言) HTML5草案的前身名为 W ...