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

来源:互联网 发布:qq匿名查看软件 编辑:程序博客网 时间:2024/04/28 14:35

问题及代码:

/* * 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_INCLUDEDtypedef 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;}


运行结果:


知识点总结:

链栈的基本操作和应用

学习心得:

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

0 0
原创粉丝点击