问题与代码
/*
*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;
}
运行结果
知识点总结
使用链栈,进行了关于括号的匹配的实践。