栈的应用-括号的匹配

原创 2016年08月28日 16:26:11

//STACK.H

#ifndef STACK_H

#define STACK_H


#include <stdlib.h>


#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量


#define SElemType char
#define Status int


typedef struct{
SElemType *top;
SElemType *base;
int stacksize;
}SqStack;


Status InitStack(SqStack *S);
Status Push(SqStack *S, SElemType e);
Status Pop(SqStack *S, SElemType *e);
Status StackEmpty(SqStack S);
Status GetTop(SqStack S, SElemType *e);


Status InitStack(SqStack *S)
{
S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S->base)
exit(0);
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;


return 0;
}


Status 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)
exit(0);
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top++ = e;
return 0;
}


Status Pop(SqStack *S, SElemType *e)
{
if(S->top == S->base) //栈空
exit(0);
*e = *--S->top;
return 0;
}


Status StackEmpty(SqStack S)
{
if(0 == S.top -S.base)
return 1; //堆栈为空
return 0;
}


Status GetTop(SqStack S, SElemType *e)
{
if(0 == S.top - S.base)
return 1;
*e = *(S.top - 1);
return 0;
}


#endif


#include "STACK.H"
#include <stdio.h>


//main.c
int main ()
{
char ch1;
char ch2 = 0;
int n = 0;


SqStack S;
InitStack(&S);


while(ch1 = getchar())
{
switch(ch1)
{
case '(':
case '[':
case '{':
Push(&S, ch1);
continue;
case ' ':
case '\t':
case '\n':
continue; //取走缓冲区的空白字符
case ')':
if(!StackEmpty(S)){ 
if('(' == (GetTop(S,&ch2),ch2)){
Pop(&S, &ch2);
printf("%c %c\n",ch2, ch1);
continue;
}
printf("不合法\n");
break;
}
case ']':
if(!StackEmpty(S)){ 
if('[' == (GetTop(S,&ch2),ch2)){
Pop(&S, &ch2);
printf("%c %c\n",ch2, ch1);
continue;
}
printf("不合法\n");
break;
}
case '}':
if(!StackEmpty(S)){ 
if('{' == (GetTop(S,&ch2),ch2)){
Pop(&S, &ch2);
printf("%c %c\n",ch2, ch1);
continue;
}
printf("不合法\n");
break;
}
case '#':
printf("输入结束\n");
break; //跳出switch语句
default: //取走缓冲区中不合法的字符
continue;
}
break; //结束循环
}
return 0;
}


【数据结构栈应用系列】括号匹配

括号匹配算法在各种编程的IDE工具中都会用到,用来检测关于括号匹配的语法错误,括号匹配实际上不复杂,主要就是利用栈这个数据结构,扫描输入的字符串,若遇到左括号则直接入栈,若遇到右括号则弹出栈顶括号,看...
  • htq__
  • htq__
  • 2016年03月26日 16:59
  • 11987

<数据结构>栈的应用一:括号匹配检测

括号匹配检测问题的简单描述:假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序随意,即([]())或者[([][])]等为正确的格式,([)]或者([][]等均为不正确的格式。 我实现的程序中...
  • fzh1900
  • fzh1900
  • 2013年11月01日 19:00
  • 1019

C/C++数据结构通过顺序栈实现括号()匹配算法

#include #include #include #include #include #define OK 1 #define ERROR 0 #define MAXSIZ...
  • li99yangg
  • li99yangg
  • 2017年10月08日 20:43
  • 354

栈用于解决括号匹配问题

在编写程序的过程中,我们经常需要对一串括号是否匹配进行判断。如何判断呢?我们可以借助栈来进行判断。基本思路是:遍历字符串,当发现有右括号而此时的栈顶元素又恰好是与之匹配的左括号时,则栈顶元素出栈;其余...
  • kelvinmao
  • kelvinmao
  • 2016年04月07日 23:01
  • 1338

多括号匹配——栈的应用

EOF    ctrl+z    停止         EOF为计算机术语End Of File的缩写。在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。在C标准库中,像getch...
  • poison_biti
  • poison_biti
  • 2016年08月04日 17:10
  • 413

栈的基本操作及如何判断一个表达式中的左右括号是否匹配

我们都知道,栈(stack)具有后进先出的特点,所以在我们思考一个表达式中的左右括号是否匹配问题时,就自然会想到是不是可以利用栈的特点来判断左右括号是否匹配呢? 主要思路如下: 1.扫描整个表达式;...
  • qq_34992845
  • qq_34992845
  • 2017年04月21日 12:25
  • 1567

字符串匹配问题(栈)

字符串匹配问题 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Sub...
  • u012773338
  • u012773338
  • 2014年11月02日 20:33
  • 689

数据结构实践——括号的匹配(栈)

本文是针对数据结构基础系列网络课程(3):栈和队列的实现项目。【项目3 - 括号的匹配】 假设表达式中允许三种括号:圆括号、方括号和大括号。编写一个算法,判断表达式中的各种左括号是否与右括号匹配。 ...
  • sxhelijian
  • sxhelijian
  • 2015年09月19日 22:07
  • 3981

栈和队列应用之括号匹配

一.题目描述 假设一个表达式或一段程序中含有三种括号:圆括号“(”和“)”、方括号“[”和“]”、花括号“{”和“}”。试写一个程序判别给定的表达式或程序中所含括号是否正确配对出现。 输入说明: ...
  • lhyer
  • lhyer
  • 2015年08月14日 17:16
  • 1274

关于栈的应用-括号匹配问题的两种解题思路

1.解法1的思路是:先把字符串转换为数组,然后遍历数组,一旦遇到 左括号,则将它压入栈中,然后依次先对( [ {进行匹配顺序的判断,最后进行括号数量的判断,具体代码如下: public static...
  • Mypromise_TFS
  • Mypromise_TFS
  • 2016年12月05日 11:21
  • 356
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:栈的应用-括号的匹配
举报原因:
原因补充:

(最多只允许输入30个字)