第六周项目3 括号的匹配

问题与代码

/* 
 
 *Copyright (c) 2015,烟台大学计算机与控制工程学院 
 
 *All rights reserved.
  
 *文件名称:head.h,main.cpp,zdy.cpp,match.cpp 
 
 *作者:陈梦萍 
 
 *完成日期:2015年11月02日 
 
 *版本号:v1.0 
 
 * 
 
 *问题描述: 括号的匹配
 
 *输入描述:输入表达式
 
 *程序输出:匹配是否正确 
 
 */ 


//head.h

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

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);  //输出栈中元素
bool isMatch(char *st);


//main.cpp

#include"head.h"

int main()
{

    char st[50];
    printf("请输入表达式:");
    scanf("%s", st);
    if(isMatch(st))
        printf("配对正确!!\n");
    else
        printf("配对错误!!\n");
    return 0;
}


//zdy.cpp

 

#include"head.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);    
}

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;              
    p->next=s->next;     
    s->next=p;
}

bool Pop(LiStack *&s,ElemType &e) 
{
    LiStack *p;
    if (s->next==NULL)     
        return false;
    p=s->next;           
    e=p->data;
    s->next=p->next;       
    free(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");
}


//match.cpp

#include"head.h"

bool isMatch(char *st)
{
    int d=1, i;
    char c;
    LiStack *s;
    InitStack(s);
    for(i=0; st[i]!='\0'&&d; i++)
    {
        switch(st[i])
        {
        case'(':
        case'[':
        case'{':
            Push(s, st[i]);
            break;
        case')':
            Pop(s, c);
            if(c!='(') d=0;
            break;
        case']':
            Pop(s, c);
            if(c!='[') d=0;
            break;
        case'}':
            Pop(s,c);
            if(c!='{') d=0;
            break;
        }
    }
    if(StackEmpty(s)&&d==1)
        return true;
    else
        return false;
}


运行结果

 

 

知识点总结

            使用链栈,进行了关于括号的匹配的实践。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值