第5周项目3-括号的匹配

博客内容介绍了使用链栈解决括号匹配问题,通过listack.cpp和main.cpp的代码实现,展示了链栈的基本操作,并提供了运行结果。文章还总结了链栈在括号匹配中的应用及其学习心得。

问题及代码:

/* 
* Copyright(c) 2016, 烟台大学计算机与控制工程学院 
* All rights reserved. 
* 文件名称: 
* 作    者:路亚丽 
* 完成日期:2016年  9月  29日 
* 版 本 号:v1.0 
* 
* 问题描述: 假设表达式中允许三种括号:圆括号、方括号和大括号。编写一个算法,判断表达式中的各种左括号是否与右括号匹配。 
* 输入描述:2+(3+4)*[2+{[3]}-8   2+(3+4*[2)+{[3]}-8,
* 程序输出:匹配是否成功 
*/  

listack.h:

#ifndef LISTACK_H_INCLUDED
#define LISTACK_H_INCLUDED
typedef char ElemType;
typedef struct linknode
{
    ElemType data;              //数据域
    struct linknode *next;      //指针域
} LiStack;                      //链栈类型定义

void InitStack(LiStack *&s);  //初始化栈
void DestroyStack(LiStack *&s);  //销毁栈
int StackLength(LiStack *s);  //返回栈长度
bool StackEmpty(LiStack *s);  //判断栈是否为空
void Push(LiStack *&s,ElemType e);  //入栈
bool Pop(LiStack *&s,ElemType &e);  //出栈
bool GetTop(LiStack *s,ElemType &e);  //取栈顶元素
void DispStack(LiStack *s);  //输出栈中元素




#endif // LISTACK_H_INCLUDED


listack.cpp:

#include <stdio.h>
#include <malloc.h>
#include "listack.h"

void InitStack(LiStack *&s)  //初始化栈
{
    s=(LiStack *)malloc(sizeof(LiStack));
    s->next=NULL;
}

void DestroyStack(LiStack *&s)  //销毁栈
{
    LiStack *p=s->next;
    while (p!=NULL)
    {
        free(s);
        s=p;
        p=p->next;
    }
    free(s);    //s指向尾结点,释放其空间
}

int StackLength(LiStack *s)  //返回栈长度
{
    int i=0;
    LiStack *p;
    p=s->next;
    while (p!=NULL)
    {
        i++;
        p=p->next;
    }
    return(i);
}

bool StackEmpty(LiStack *s)  //判断栈是否为空
{
    return(s->next==NULL);
}

void Push(LiStack *&s,ElemType e)  //入栈
{
    LiStack *p;
    p=(LiStack *)malloc(sizeof(LiStack));
    p->data=e;              //新建元素e对应的节点*p
    p->next=s->next;        //插入*p节点作为开始节点
    s->next=p;
}

bool Pop(LiStack *&s,ElemType &e)  //出栈
{
    LiStack *p;
    if (s->next==NULL)      //栈空的情况
        return false;
    p=s->next;              //p指向开始节点
    e=p->data;
    s->next=p->next;        //删除*p节点
    free(p);                //释放*p节点
    return true;
}

bool GetTop(LiStack *s,ElemType &e)  //取栈顶元素
{
    if (s->next==NULL)      //栈空的情况
        return false;
    e=s->next->data;
    return true;
}

void DispStack(LiStack *s)  //输出栈中元素
{
    LiStack *p=s->next;
    while (p!=NULL)
    {
        printf("%c ",p->data);
        p=p->next;
    }
    printf("\n");
}


main.cpp:

#include <stdio.h>
#include <string.h>
#include "listack.h"
bool match1(ElemType exp[],int n)
{
    int i=0;
    char e;
    bool match=true;
    LiStack *st;
    InitStack(st);                //初始化栈
    while(i<n && match)           //扫描exp中的所有字符
    {
        if(exp[i]=='(')           //当前字符为左括号,进栈
            Push(st,exp[i]);
        else if(exp[i]==')')      //当前字符为右括号
        {
            if(GetTop(st,e)==true)//能够取出栈顶元素
            {
                if(e!='(')        //栈顶元素不为'('时表示不匹配
                    match=false;
                else              //匹配,将栈顶元素出栈
                    Pop(st,e);
            }
            else
                match=false;      //无法取出栈顶元素,表示不匹配
        }
        i++;
    }

    if(!StackEmpty(st))           //最后栈不空时,表示不匹配
        match=false;
    DestroyStack(st);             //销毁栈
    return match;
}
bool match2(ElemType exp[],int n)
{
    int i=0;
    char e;
    bool match=true;
    LiStack *st;
    InitStack(st);                //初始化栈
    while(i<n && match)           //扫描exp中的所有字符
    {
        if(exp[i]=='[')           //当前字符为左括号,进栈
            Push(st,exp[i]);
        else if(exp[i]==']')      //当前字符为右括号
        {
            if(GetTop(st,e)==true)//能够取出栈顶元素
            {
                if(e!='[')        //栈顶元素不为'['时表示不匹配
                    match=false;
                else              //匹配,将栈顶元素出栈
                    Pop(st,e);
            }
            else
                match=false;      //无法取出栈顶元素,表示不匹配
        }
        i++;
    }
    if(!StackEmpty(st))           //最后栈不空时,表示不匹配
        match=false;
    DestroyStack(st);             //销毁栈
    return match;
}
bool match3(ElemType exp[],int n)
{
    int i=0;
    char e;
    bool match=true;
    LiStack *st;
    InitStack(st);                //初始化栈
    while(i<n && match)           //扫描exp中的所有字符
    {
        if(exp[i]=='{')           //当前字符为左括号,进栈
            Push(st,exp[i]);
        else if(exp[i]=='}')      //当前字符为右括号
        {
            if(GetTop(st,e)==true)//能够取出栈顶元素
            {
                if(e!='{')        //栈顶元素不为'{'时表示不匹配
                    match=false;
                else              //匹配,将栈顶元素出栈
                    Pop(st,e);
            }
            else
                match=false;      //无法取出栈顶元素,表示不匹配
        }
        i++;
    }
    if(!StackEmpty(st))           //最后栈不空时,表示不匹配
        match=false;
    DestroyStack(st);             //销毁栈
    return match;
}
int main()
{
    ElemType a[1000];
    int n;
    printf("请输入表达式:");
    while(gets(a))
    {
        n=strlen(a);
        if(match1(a,n) && match2(a,n) && match3(a,n))
            printf("匹配正确!\n");
        else
            printf("匹配错误!\n");
    }
    return 0;
}


运行结果:


知识点总结:

链栈的基本操作和应用

学习心得:

参照课本例题巩固了链栈的基本操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值