用栈将线性表逆置实验.docx
- 文档编号:24523294
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:10
- 大小:33.48KB
用栈将线性表逆置实验.docx
《用栈将线性表逆置实验.docx》由会员分享,可在线阅读,更多相关《用栈将线性表逆置实验.docx(10页珍藏版)》请在冰豆网上搜索。
用栈将线性表逆置实验
数据结构课程设计题
实验2 栈
一、实验的目的要求
1、了解栈的特性,以及它在实际问题中的应用。
2、掌握栈的实现方法以及它的基本操作,学会运用栈来解决问题。
二、实验的主要内容
1、已知head是带头结点的单链表(a1,a2,…,an)(其中n>=0),有关说明如下:
typedefintdatatype;
#include
#define NULL0
typedefstructnode
{datatypedata;
structnode*next;
}linklist;
linklist*head;
请设计一个算法,利用一个栈将上述单链表实现逆置,即利用一个栈将单链表(a1,a2,…,an)(其中n>=0)逆置为(an,an-1,…,a1)。
调试运行实例:
⑴含多个结点的顺序表(2,4,6,8,10);
⑵含一个结点的顺序表(5);
⑶空表()。
三、栈的特性
1、栈(Stack)是限定在表尾进行插入和删除操作的线性表。
其表尾称为栈顶(top),表头称为栈底(bottom)。
栈的特点是后进先出(LastInFirstOut)。
出栈 入栈
栈顶 an
┇
a3
a2
栈底 a1
图2.1栈的示意图
2、栈的基本操作
和线性表类似,栈也有两种存储结构,即顺序栈和链栈。
⑴顺序栈可以定义为
#definemaxsize100 /*栈的最大元素数为100*/
typedefstruct /*定义顺序栈*/
{datatyped[maxsize];
inttop;
}seqstack;
seqstack*s; /*定义顺序栈的指针*/
顺序栈的基本操作如下:
①栈的初始化(建立一个空栈)
voidInitStack(seqstack*s) /*构造一个空栈s*/
{s->top=-1;
}
②入栈操作
seqstack*push(seqstack*s,datatypex) /*入栈*/
{if(s->top==maxsize-1)
{printf(“栈已满,不能入栈!
\n”);
returnNULL;
}
else{s->top++; /*栈顶指针上移*/
s->d[s->top]=x; /*将x存入栈中*/
returns;
}
}
③出栈函数
datatypepop(seqstack*s) /*出栈*/
{datatypey;
if(s->top==-1)
{printf(“栈为空,无法出栈!
\n”);
return0;
}
else{y=s->d[s->top]; /*栈顶元素出栈,存入y中*/
s->top--; /*栈顶指针下移*/
returny;
}
}
④判栈空函数
intStackEmpty(seqstack*s)
{if(s->top==-1)return1; /*栈为空时返回1(真)*/
elsereturn0; /*栈非空时返回0(假)*/
}
⑵链栈可以定义为
#defineNULL0
typedefstructnode /*定义链栈结点类型*/
{datatypedata;
structnode*next;
}linkstack;
linkstack*top; /*定义栈顶指针*/
链栈的基本操作如下:
①栈的初始化(建立一个空栈)
voidinit_linkstack(linkstack*top)
{top=NULL;
}
②入栈操作
linkstack*push_linkstack(linkstack*top,datatypex)
{linkstack*p;
p=(linkstack*)malloc(sizeof(linkstack));/*开辟新结点*/
p->data=x;
p->next=top;
top=p;
returntop;
}
③出栈函数
datatypepop_linkstack(linkstack*top) /*出栈*/
{datatypey;
linkstack*p;
if(top==NULL)
{printf(“栈为空,无法出栈!
\n”);
return0;
}
else{p=top;
y=top->data; /*栈顶元素出栈,存入y中*/
top=top->next; /*栈顶指针下移*/
free(p); /*释放存储空间*/
returny;
}
}
④判栈空函数
intempty_linkstack(linkstack*top)
{if(top==NULL)return1; /*栈为空时返回1(真)*/
elsereturn0; /*栈非空时返回0(假)*/
}
四、解题思路
方法1(将链表结点中的数据入栈,用顺序栈实现)
1、建立一个带头结点的单链表head;
2、输出该单链表;
3、建立一个空栈s;
4、依次将单链表的数据入栈;
5、依次将单链表的数据出栈,并逐个将出栈的数据存入单链表的数据域(自前向后);
6、再输出单链表。
程序如下(采用顺序栈实现):
typedefintdatatype;
#include
#defineNULL0
#definemaxsize100 /*设栈的最大元素数为100*/
typedefstructnode
{datatypedata;
structnode*next;
}linklist;
linklist*head; /*定义单链表的头指针*/
typedefstruct /*定义顺序栈*/
{datatyped[maxsize];
inttop;
}seqstack;
seqstack*s; /*定义顺序栈的指针*/
linklist*creatlist() /*建立单链表*/
{linklist*p,*q;
/*intn=0;*/
p=q=(structnode*)malloc(sizeof(linklist));
head=p;
p->next=NULL; /*头结点的数据域不存放任何东西*/
p=(structnode*)malloc(sizeof(linklist));
scanf("%d",&p->data);
while(p->data!
=-1) /*输入-1表示链表结束*/
{/*n=n+1;*/
q->next=p;
q=p;
p=(structnode*)malloc(sizeof(linklist));
scanf("%d",&p->data);
}
q->next=NULL;
returnhead;
}
voidprint(linklist*head;) /*输出单链表*/
{linklist*p;
p=head->next;
if(p==NULL)printf("Thisisanemptylist.\n");
else
{do {printf("%6d",p->data); p=p->next;
}while(p!
=NULL);
printf("\n");
}
}
voidInitStack(seqstack*s) /*构造一个空栈s*/
{s->top=-1;
}
seqstack*push(seqstack*s,datatypex) /*入栈*/
{if(s->top==maxsize-1)
{printf(“栈已满,不能入栈!
\n”);
returnNULL;
}
else{s->top++; /*栈顶指针上移*/
s->d[s->top]=x; /*将x存入栈中*/
returns;
}
}
datatypepop(seqstack*s) /*出栈*/
{datatypey;
if(s->top==-1)
{printf(“栈为空,无法出栈!
\n”);
return0;
}
else{y=s->d[s->top]; /*栈顶元素出栈,存入y中*/
s->top--; /*栈顶指针下移*/
returny;
}
}
intStackEmpty(seqstack*s)
{if(s->top==-1)return1; /*栈为空时返回1(真)*/
elsereturn0; /*栈非空时返回0(假)*/
}
linklist*back_linklist(linklist*head) /*利用栈s逆置单链表*/
{linklist*p;
p=head->next; /*p指向首元结点*/
InitStack(s); /*构造一个空栈,即栈的初始化*/
while(p)
{push(s,p->data); /*链表结点中的数据入栈*/
p=p->next; /*p指针后移*/
}
p=head->next; /*p再指向首元结点*/
while(!
StackEmpty(S)) /*当栈S非空时循环*/
{p->data=pop(s); /*数据出栈,并存入p所指结点的数据域*/
p=p->next; /*p指针后移*/
}
returnhead;
}
main()
{linklist*head;
head=creatlist();
print(head);
head=back_linklist(head);
print(head);
}
此算法的时间复杂度为O(n);算法的空间复杂度为O(n)。
为什么?
想一想,在上述问题中,①能不能将链表结点中的地址入栈,来实现一个单链表的逆置?
②如果要求使用链栈来实现单链表的逆置,那么程序应该怎么修改?
思考题请设计一个算法,用一个栈S将一个队列Q逆置,①要求采用顺序栈和顺序队列来实现;②要求采用链栈和链队列来实现。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 用栈将 线性 表逆置 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)