数据结构括号匹配(附源代码已测试)
来源:互联网 发布:淘宝联盟的返利 编辑:程序博客网 时间:2024/05/29 07:43
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define STACK_INIT_SIZE 100#define STACKINCREACE 10typedef struct{ char *base; char *top; int stacksize;}stack;int main(){ // 初始化栈 void InitStack(stack *s); // Push入栈 void Push(stack *s, char e); // Pop出栈,删除栈顶元素 void Pop(stack *s); // 返回栈顶元素 char GetTop(stack *s, char e); // 计算栈的长度,判断是否栈空 int Top_Base(stack *s); // 定义 stack s; int i; int num; char a[20];//最大的括号数 char temp,e; int temper; InitStack(&s); // 1.输入括弧,并用空格隔开 printf("Please input the bracket's number u want:"); scanf("%d",&num); getchar(); printf("Please input the bracket without space:\n"); for(i=0;i<num;i++) scanf("%c",&a[i]); // 2.依次判断左括号还是右括号,并作出不同操作 if((a[0] == ')') || (a[0] == ']') || (a[0] == '}')) printf("Fail to match!"); for(i=0; i<num; i++) { // 2.1判断若是左括号则入栈 if((a[i]=='[') || (a[i]=='{') || (a[i]=='(')) { Push(&s, a[i]); continue; } // 否则是右括号则去栈顶元素进行判断是否匹配 else { // 取栈顶元素进行匹配比较 temp = GetTop(&s, e); // 2.1.1如果栈顶元素与右括号匹配则continue比较下一个 switch(temp) { case '(': if(a[i] == ')') {Pop(&s); continue;} case '[': if(a[i] == ']') {Pop(&s); continue;} case '{': if(a[i] == '}') {Pop(&s); continue;} default: printf("Fail to match!"); } } } // 如果站内括号都匹配完毕,则栈为空,表明匹配成功。栈空即s->top - s->base ==0 temper = Top_Base(&s); if(temper == 0) printf("Success to match!"); else printf("Fail to match!"); return 0;}void InitStack(stack *s){ // 动态分配内存 s->base = (char *)malloc(STACK_INIT_SIZE * sizeof(char)); s->top = s->base; s->stacksize += STACKINCREACE;}void Push(stack *s, char e){ //判断是否栈满,如果栈满则增加空间 if(s->top - s->base == s->stacksize) { s->base = (char *)realloc(s->base, STACKINCREACE * sizeof(char)); // 若内存分配失败,则退出 if(!s->base) exit(0); // 分配成功则改变栈的指标 s->top = s->base + s->stacksize;// 保证分配前top指针在栈顶,因为有可能出现栈满top++不在栈内的情况 s->stacksize += STACKINCREACE; } *(s->top) = e; s->top++;}char GetTop(stack *s, char e){ // 如果栈空,则退出 if(s->base == s->top) exit(0); e = *(s->top - 1); return e;}int Top_Base(stack *s){ s->stacksize = s->top - s->base; return s->stacksize;}void Pop(stack *s){ s->top = s->top - 1;}总结:
1、s->top与s->base的差显示的是两个指针指向块数的差
2、在连续两次scanf(),进行输入时中间需要回车一下,一定记得用getchar(),接一下回车键,
不然会出错,输入错位。
3、逻辑思维还需要进一步锻炼,程序编码前流程图还需要缜密逻辑强一些。
- 数据结构括号匹配(附源代码已测试)
- 数据结构——链栈(附基本的括号匹配)
- 括号匹配源代码
- 数据结构 括号匹配
- 数据结构括号匹配
- 数据结构:括号匹配
- 数据结构-括号匹配程序
- 数据结构_括号匹配
- 【数据结构】括号匹配
- 数据结构-栈-括号匹配
- 数据结构之括号匹配
- 数据结构--括号匹配检验
- 括号匹配测试
- 括号匹配检验 数据结构运用
- 数据结构栈应用括号匹配
- 数据结构之括号匹配问题
- 数据结构——括号匹配
- 数据结构(C语言)---括号匹配
- 设计模式——开放-封闭原则
- 单例模式
- 文本文件及二进制文件的大小, Unicode/utf-8/ansi编码格式
- 关于php相关压力、性能测试备忘
- 使用C API操作mysql数据库
- 数据结构括号匹配(附源代码已测试)
- Linux下安装配置gitweb
- 单机安装运行PBS (Torque)
- JPA的多对多映射
- 二叉树的创建和遍历(附代码已测试)
- ArchSummit架构师峰会 资料下载
- mysql中主从复制延迟问题
- Android 判断SIM卡属于哪个移动运营商
- C语言札记之语句