8、数据结构笔记之八栈的应用之括号匹配检验实现

8、数据结构笔记之八栈的应用之括号匹配检验实现

           “人生的意义就在这个过程上。你要细细体认和玩味这个过程中的每节,无论它是一节黄金或一节铁;你要认识每节的充分价值。” 

1.  括号匹配问题

括号匹配问题是指要匹配一个字符串的左,右括号:括号问题可以用来解决C语言中的“{”和“}”的匹配问题,可以观察到,如果从左至右扫描一个字符串,那么每个右括号将于最近遇到的那个未匹配的左括号相匹配,在从左至右的扫描工程中把所遇到的左括号存放到堆栈内,每当遇到一个右括号时,就将它与栈顶的左括号(如果存在)相匹配,同时从栈顶删除该左括号。

           在编译器中适用很多,此外括号匹配问题和栈的特性非常吻合。

2.  结构定义

定义栈的最大空间为100,可以存放100个左右括号

#defineStackSize100   //假定预分配的栈空间最多为100个元素

#defineMaxLength100   //最大的字符串长度

typedefintDataType;   //假定栈元素的数据类型为整数

typedefstruct

{

    DataTypedata[StackSize];

    inttop;

}SeqStack;

其中结构体中定义了一个数组,一个整型。数组模拟堆栈,整型表示堆的TOP指针。

3.  初始化堆

设置top为-1,因为数组是从0开始的。

void Initial(SeqStack *S)

{

    S-> top = -1;

}

 

4.  判断栈是否空满

通过结构体中的top来判断是否为空为满

//判断栈是否空

int IsEmpty(SeqStack *S)

{

    returnS-> top == -1;

}

 

//判断栈是否满

int IsFull(SeqStack *S)

{

    returnS-> top == StackSize -1;

}

 

5.  进栈出栈

进栈判断是否为满,出栈判断是否为空。

进栈将top值加1,出栈将top 值减1.

//进栈

void Push(SeqStack *S, DataTypex)

{

    if(IsFull(S))

    {

       printf("栈上溢!");

       exit(1);

    }

 

    S-> data[++ S -> top] = x;

 

    return;

}

 

//出栈

DataType Pop(SeqStack *S)

{

    if(IsEmpty(S))

    {

       printf("栈为空!");

        return-1;

    }

 

    returnS-> data[S -> top--];

}

 

6.  括号匹配

出现(,则压入栈,出现)则出栈,同时判断弹出的top值是否为-1. 如果为1,说明)括号多了,弹不出(括号了。最后判断栈是否为空,如果不为空,则说明有多余的(符号。

//括号匹配

void PrintMatchedPairs(char *expr)

{

    SeqStackS;

    int i, j , length = strlen(expr);

 

   Initial(&S);

 

    for(i= 1 ; i <= length ; i++)

    {

        if(expr[i- 1] == '(')

        {

           Push(&S,i);

        }

        elseif(expr[i- 1] == ')')

        {

            j= Pop(&S);

            if(j== -1)

            {

               printf("没有对应第%d个右括号的左括号\n", i);

            }

            else

            {

               printf("%d %d\n",i,j);

            }

        }

    }

 

    while(!IsEmpty(&S))

    {

        j =Pop(&S);

       printf("没有对应第%d个左括号的右括号\n", j);

    }

}

 

 

7.  源码

#include"stdio.h"

#include"string.h"

#include"stdlib.h"

 

 

#defineStackSize100   //假定预分配的栈空间最多为100个元素

#defineMaxLength100   //最大的字符串长度

 

typedefintDataType;   //假定栈元素的数据类型为整数

typedefstruct

{

    DataTypedata[StackSize];

    inttop;

}SeqStack;

 

//置栈空

void Initial(SeqStack *S)

{

    S-> top = -1;

}

 

//判断栈是否空

int IsEmpty(SeqStack *S)

{

    returnS-> top == -1;

}

 

//判断栈是否满

int IsFull(SeqStack *S)

{

    returnS-> top == StackSize -1;

}

 

//进栈

void Push(SeqStack *S, DataTypex)

{

    if(IsFull(S))

    {

       printf("栈上溢!");

       exit(1);

    }

 

    S-> data[++ S -> top] = x;

 

    return;

}

 

//出栈

DataType Pop(SeqStack *S)

{

    if(IsEmpty(S))

    {

       printf("栈为空!");

        return-1;

    }

 

    returnS-> data[S -> top--];

}

 

//取栈顶元素

DataType Top(SeqStack *S)

{

    if(IsEmpty(S))

    {

       printf("栈为空!\n");

       exit(1);

    }

 

    returnS-> data[S -> top];

}

 

//括号匹配

void PrintMatchedPairs(char *expr)

{

    SeqStackS;

    int i, j , length = strlen(expr);

 

   Initial(&S);

 

    for(i= 1 ; i <= length ; i++)

    {

        if(expr[i- 1] == '(')

        {

           Push(&S,i);

        }

        elseif(expr[i- 1] == ')')

        {

            j= Pop(&S);

            if(j== -1)

            {

               printf("没有对应第%d个右括号的左括号\n", i);

            }

            else

            {

               printf("%d %d\n",i,j);

            }

        }

    }

 

    while(!IsEmpty(&S))

    {

        j =Pop(&S);

       printf("没有对应第%d个左括号的右括号\n", j);

    }

}

 

void main(void)

{

    charexpr[MaxLength];

    printf("输入符号个数小于%d的表达式:\n",MaxLength);

 

   gets(expr);

 

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

 

   PrintMatchedPairs(expr);

 

    return;

}

 

 

 

 

 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值