括号匹配(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_括号匹配序列问题
括号匹配问题 简单括号匹配问题是给出字符串,判断字符串中的括号是否匹配,此类问题核心解决方案就是利用栈的后进先出的特性,从左到右依次遍历字符串,遇左括号进栈,遇右括号将其与栈顶元素配对,若能配对,则栈 ...
随机推荐
- PySpark SQL 相关知识介绍
title: PySpark SQL 相关知识介绍 summary: 关键词:大数据 Hadoop Hive Pig Kafka Spark PySpark SQL 集群管理器 PostgreSQL ...
- Vue 应用 nginx 配置 前后端不分离模式
一.先在官网下载nginx 软件,解压后放在软件盘中如D盘 将nginx 文件夹拖到编译器中,打开conf 文件夹中的 nginx.conf 文件,找到其中的server {} 配置项,默认35 行. ...
- 玩转 SpringBoot 2 快速整合 | 丝袜哥(Swagger)
概述 首先让我引用 Swagger 官方的介绍: Design is the foundation of your API development. Swagger makes API design ...
- Linux基础命令和文件权限
Linux命令与文件权限 Linux基础命令 reboot 重启 cd 切换目录 cd .. 回到上一级目录 cd ~ 回到主目录 cd / ...
- 再谈C#装箱和拆箱操作
1. 使用非泛型集合时引发的装箱和拆箱操作 看下面的一段代码: 1 2 3 4 5 6 7 8 var array = new ArrayList(); array.Add(1); array.Add ...
- Monad 在实际开发中的应用
版权归作者所有,任何形式转载请联系作者. 作者:tison(来自豆瓣) 来源:https://www.douban.com/note/733279598/ Monad 在实际开发中的应用 不同的人会从 ...
- 【百度之星】【java大数+C++做法】hdu 6719 Strassen
代码:递归搜索一下.java大数做法 import java.util.*; import java.math.*; import java.security.MessageDigest; publi ...
- 2018CCPC 吉林现场赛 赛后总结
一直以来都没有比赛完写总结的习惯,导致前面几次比赛都没有写过总结. 这是我写的第一场总结把,有时间有想法还记得细节的话再把前面几次比赛的总结给补上把. 热身赛: 热身赛的时候,写的比较急想着快点做出题 ...
- POJ 2155 Matrix (2维树状数组)
POJ-Matrix 题意:给你一个n*n矩阵的灯泡,灯泡的初始状态都为0,T次操作,分别是翻转操作:将x1,y1 --- x2, y2的灯泡状态反转 和 查询操作 找出x1, y1位置灯泡的状态. ...
- HDU 3081 Marriage Match II 二分 + 网络流
Marriage Match II 题意:有n个男生,n个女生,现在有 f 条男生女生是朋友的关系, 现在有 m 条女生女生是朋友的关系, 朋友的朋友是朋友,现在进行 k 轮游戏,每轮游戏都要男生和女 ...