数据结构实验指导书实验3

  • 格式:doc
  • 大小:110.50 KB
  • 文档页数:10

下载文档原格式

  / 10
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三栈操作

一、实验目的

1.熟悉栈的的顺序存储结构和链式存储结构定义;

2.掌握栈的基本操作,如:压栈、弹栈、判栈空、判栈满等运算。

3.掌握栈的特点(先进后出FILO),并能在实际问题背景下灵活应用。二、实验内容

示例程序1:圆括号匹配的检验(LinkStack.h+LS_ParenMatch.cpp)本示例程序在头文件LinkStack.h中定义了栈的链式存储结构,并实现了链栈的基本操作(判栈空、构造、压栈、弹栈、销毁栈等)。在文件LS_ParenMatch.cpp 中实现了栈基本操作的一个实际应用:圆括号()匹配的检验。要求学生利用头文件LinkStack.h中已经定义的栈的基本操作实现栈的其他应用,或在头文件中添加其他关于栈的基本操作。

1.LinkStack.h中代码如下:

//链栈基本操作的实现

#include

#include

#define NULL 0

//定义栈中元素的类型,可根据实际数据类型进行定义

//typedef char StackElementType;//栈中元素的类型

//#define PF "%c" //元素输出格式

//定义栈的链式存储结构

typedef struct node

{

StackElementType data;

struct node *next;

}LinkStack;

//链栈基本操作的说明

int IsEmpty(LinkStack *top);//判栈空

LinkStack *Push(LinkStack *top,StackElementType x);// 压栈

LinkStack *Pop(LinkStack *top,StackElementType &elem);//弹栈StackElementType GetTop(LinkStack *top);//取栈顶元素

void ShowStack(LinkStack *top);//输出栈中数据(顶-->底)void DestroyStack(LinkStack *top);//销毁栈

//链栈基本操作的实现

int IsEmpty(LinkStack *top)

{//判栈空

return top? 0:1;

}

LinkStack *Push(LinkStack *top,StackElementType x)

{// 压栈

LinkStack *p;

p=(LinkStack *)malloc(sizeof(LinkStack));

if(p)

{

p->data=x;

p->next=top;

top=p;

}

else

{

printf("内存空间不足,程序运行终止!\n");

exit(0);

}

return top;

}

LinkStack *Pop(LinkStack *top,StackElementType &elem)

{//弹栈

LinkStack *temp;

if(IsEmpty(top))

{

printf("空栈,出栈操作失败!\n");

return NULL;

}

else

{

temp=top;

elem=top->data;

top=top->next;

free(temp);

return top;

}

}

StackElementType GetTop(LinkStack *top)

{//取栈顶元素

if(IsEmpty(top))

{

printf("空栈,取栈顶元素失败!\n");

return 0;

}

else

return top->data;

}

void ShowStack(LinkStack *top)

{//输出栈中数据(顶-->底)

LinkStack *p;

p=top;

printf(" Stack:");

while(p)

{

printf(PF,p->data);

p=p->next;

}

printf("\n");

}

void DestroyStack(LinkStack *top)

{//销毁栈

LinkStack *p;

if(top)

{

p=top;

top=top->next;

free(p);

}

printf("栈已经销毁!\n");

}

2.LS_ParenMatch.cpp中代码如下:

//栈的一个应用实例:圆括号()匹配的检验

//假设表达式中充许括号嵌套,

//则检验括号是否匹配的方法可用“期待的急迫程度”这个概念来描述。

//例:(()()(()))

//先出现的左括号后匹配,后出现的左括号先匹配。

//符合栈的操作特性:先进后出(后进先出)。

//故可通过栈的基本操作实现括号是否匹配的检验。

//链栈基本操作的实现

//定义栈中元素的类型,可根据实际数据类型进行定义typedef char StackElementType;//元素类型

#define PF "%c" //元素输出格式

#include "linkstack.h"

//链栈头文件,实现了链栈的基本操作

//(判栈空、构造、压栈、弹栈、销毁栈、输出栈数据)

bool PMatch()

{//检查表达式中圆括号()配对是否正确

LinkStack *s=NULL;

char c,e;

printf("请输入表达式(以';'结束):\n");

c=getchar();

while(c!=';')

{

printf("读入字符为:%c",c);

ShowStack(s);

if(c=='(')

s=Push(s,c);

if(c==')')

{

if(s) s=Pop(s,e);

else {

printf("missing '('\n");

return false;

}

}

c=getchar();

}

if(!IsEmpty(s))

{

printf("missing ')'\n");

return false;

}

else { printf("Match Success!\n");

return true;