栈的顺序和链式存储的表示和实现

实验三栈的顺序和链式存储的表示和实现

实验目的:

1. 熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等。

2. 掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现。 实验内容:

1. 栈的顺序表示和实现

编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能。

(1) 初始化顺序栈

(2) 插入一个元素

(3) 删除栈顶元素

(4) 取栈顶元素

(5) 便利顺序栈

(6) 置空顺序栈

#include

#include

#define MAXNUM 20

#define elemtype int

//定义顺序栈的存储结构

typedef struct

{

elemtype stack[MAXNUM];

int top;

}sqstack;

//初始化顺序栈

void initstack(sqstack *p)

{

if(!p)

printf("error");

p->top=-1;

}

//入栈

void push(sqstack *p,elemtype x)

{

}

//出栈

elemtype pop(sqstack *p)

{

}

//获取栈顶元素

elemtype gettop(sqstack *p)

{

elemtype x;

if(p->top!=-1)

{

x=p->stack[p->top];

return x;

}

else

{

printf("Underflow!\n");

return 0;

}

}

//遍历顺序栈

void outstack(sqstack *p)

{

int i;

printf("\n");

if(p->top

printf("这是一个空栈!\n");

for(i=p->top;i>=0;i--)

printf("第%d个数据元素是:%6d\n",i,p->stack[i]);

}

//置空顺序栈

void setempty(sqstack *p)

{

}

//主函数

main()

{

sqstack *q;

int y,cord;

elemtype a;

do

{

printf("\n第一次使用必须初始化!\n\n");

printf("\n 主菜单 \n");

printf("\n 1 初始化顺序栈 \n");

printf("\n 2 插入一个元素 \n");

printf("\n 3 删除栈顶元素 \n");

printf("\n 4 取栈顶元素 \n");

printf("\n 5 置空顺序栈 \n");

printf("\n 6 结束程序运行

printf("\n----------------------------------\n");

printf("请输入您的选择(1,2,3,4,5,6)");

scanf("%d",&cord);

printf("\n");

switch(cord)

{

case 1:

{

q=(sqstack *)malloc(sizeof(sqstack));

initstack(q);

outstack(q);

}break;

case 2:

{

printf("请输入要插入的数据元素:a=");

scanf("%d",&a);

push(q,a);

outstack(q);

}break;

case 3:

{

pop(q);

outstack(q);

}break;

case 4:

{

y=gettop(q);

printf("\n栈顶元素为: %d\n",y);

outstack(q);

}break;

case 5:

{

setempty(q);

printf("\n顺序栈被置空! \n"); \n");

outstack(q);

}break;

case 6:

exit(0);

}

}

while(cord

}

2. 栈的链式表示和实现

编写一个程序实现链栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能。

(1) 初始化链栈

(2) 入栈

(3) 出栈

(4) 取栈顶元素

(5) 置空链栈

(6) 遍历链栈

参考代码:

#include

#include

#include

#define null 0

typedef int elemtype;

typedef struct stacknode

{

elemtype data;

stacknode *next;

}stacknode;

typedef struct

{

stacknode *top;

}linkstack;

//初始化链栈

void initstack(linkstack *s)

{

s->top=null;

printf("\n已经初始化链栈!\n");

}

//链栈置空

void setempty(linkstack *s)

{

s->top=null;

printf("\n链栈被置空!\n");

}

//入栈

void pushlstack(linkstack *s,elemtype x)

{

}

//出栈

elemtype poplstack(linkstack *s)

{

}

//取栈顶元素

elemtype stacktop(linkstack *s)

{

if(s->top==0)

{

printf("\n链栈空\n");

exit(-1);

}

return s->top->data;

}

//遍历链栈

void disp(linkstack *s)

{

printf("\n链栈中的数据位:\n");

printf("=======================================\n"); stacknode *p;

p=s->top;

while(p!=null)

{

printf("%d\n",p->data);

p=p->next;

}

printf("=====================================\n"); }

//主函数

void main()

{

printf("==============链栈操作================\n"); int i,m,n,a;

linkstack *s;

s=(linkstack *)malloc (sizeof(linkstack));

int cord;

do

{

printf("\n第一次使用必须初始化!\n\n");

printf("\n 主菜单 \n");

printf("\n 1 初始化链栈 \n"); printf("\n 2 入栈 \n");

printf("\n 3 出栈 \n");

printf("\n 4 取栈顶元素 \n"); printf("\n 5 置空链栈 \n");

printf("\n 6 结束程序运行 \n"); printf("\n----------------------------------\n");

printf("请输入您的选择(1,2,3,4,5,6)");

scanf("%d",&cord);

printf("\n");

switch(cord)

{

case 1:

{initstack(s);

disp(s);

}break;

case 2:

{printf("输入将要压入链栈的数据的个数:n=");

scanf("%d",&n);

printf("依次将%d个数据压入链栈:\n",n);

for(i=1;i

{

scanf("%d",&a);

pushlstack(s,a);

}

disp(s);

}break;

case 3:

{

printf("\n出栈操作开始!\n");

printf("输入将要出栈的数据个数:m=");

scanf("%d",&m);

for(i=1;i

{

printf("\n第%d次出栈的数据是:%d\n",i,poplstack(s)); }break;

}

case 4:

{

printf("\n\n链栈的栈顶元素为:%d\n\n",stacktop(s)); }break;

case 5:

{

setempty(s);

disp(s);

}break;

case 6:exit(0);

}

}while(cord

}

实验总结:

实验三栈的顺序和链式存储的表示和实现

实验目的:

1. 熟悉栈的特点(先进后出)及栈的基本操作,如入栈、出栈等。

2. 掌握栈的基本操作在栈的顺序存储结构和链式存储结构上的实现。 实验内容:

1. 栈的顺序表示和实现

编写一个程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能。

(1) 初始化顺序栈

(2) 插入一个元素

(3) 删除栈顶元素

(4) 取栈顶元素

(5) 便利顺序栈

(6) 置空顺序栈

#include

#include

#define MAXNUM 20

#define elemtype int

//定义顺序栈的存储结构

typedef struct

{

elemtype stack[MAXNUM];

int top;

}sqstack;

//初始化顺序栈

void initstack(sqstack *p)

{

if(!p)

printf("error");

p->top=-1;

}

//入栈

void push(sqstack *p,elemtype x)

{

}

//出栈

elemtype pop(sqstack *p)

{

}

//获取栈顶元素

elemtype gettop(sqstack *p)

{

elemtype x;

if(p->top!=-1)

{

x=p->stack[p->top];

return x;

}

else

{

printf("Underflow!\n");

return 0;

}

}

//遍历顺序栈

void outstack(sqstack *p)

{

int i;

printf("\n");

if(p->top

printf("这是一个空栈!\n");

for(i=p->top;i>=0;i--)

printf("第%d个数据元素是:%6d\n",i,p->stack[i]);

}

//置空顺序栈

void setempty(sqstack *p)

{

}

//主函数

main()

{

sqstack *q;

int y,cord;

elemtype a;

do

{

printf("\n第一次使用必须初始化!\n\n");

printf("\n 主菜单 \n");

printf("\n 1 初始化顺序栈 \n");

printf("\n 2 插入一个元素 \n");

printf("\n 3 删除栈顶元素 \n");

printf("\n 4 取栈顶元素 \n");

printf("\n 5 置空顺序栈 \n");

printf("\n 6 结束程序运行

printf("\n----------------------------------\n");

printf("请输入您的选择(1,2,3,4,5,6)");

scanf("%d",&cord);

printf("\n");

switch(cord)

{

case 1:

{

q=(sqstack *)malloc(sizeof(sqstack));

initstack(q);

outstack(q);

}break;

case 2:

{

printf("请输入要插入的数据元素:a=");

scanf("%d",&a);

push(q,a);

outstack(q);

}break;

case 3:

{

pop(q);

outstack(q);

}break;

case 4:

{

y=gettop(q);

printf("\n栈顶元素为: %d\n",y);

outstack(q);

}break;

case 5:

{

setempty(q);

printf("\n顺序栈被置空! \n"); \n");

outstack(q);

}break;

case 6:

exit(0);

}

}

while(cord

}

2. 栈的链式表示和实现

编写一个程序实现链栈的各种基本运算,并在此基础上设计一个主程序,完成如下功能。

(1) 初始化链栈

(2) 入栈

(3) 出栈

(4) 取栈顶元素

(5) 置空链栈

(6) 遍历链栈

参考代码:

#include

#include

#include

#define null 0

typedef int elemtype;

typedef struct stacknode

{

elemtype data;

stacknode *next;

}stacknode;

typedef struct

{

stacknode *top;

}linkstack;

//初始化链栈

void initstack(linkstack *s)

{

s->top=null;

printf("\n已经初始化链栈!\n");

}

//链栈置空

void setempty(linkstack *s)

{

s->top=null;

printf("\n链栈被置空!\n");

}

//入栈

void pushlstack(linkstack *s,elemtype x)

{

}

//出栈

elemtype poplstack(linkstack *s)

{

}

//取栈顶元素

elemtype stacktop(linkstack *s)

{

if(s->top==0)

{

printf("\n链栈空\n");

exit(-1);

}

return s->top->data;

}

//遍历链栈

void disp(linkstack *s)

{

printf("\n链栈中的数据位:\n");

printf("=======================================\n"); stacknode *p;

p=s->top;

while(p!=null)

{

printf("%d\n",p->data);

p=p->next;

}

printf("=====================================\n"); }

//主函数

void main()

{

printf("==============链栈操作================\n"); int i,m,n,a;

linkstack *s;

s=(linkstack *)malloc (sizeof(linkstack));

int cord;

do

{

printf("\n第一次使用必须初始化!\n\n");

printf("\n 主菜单 \n");

printf("\n 1 初始化链栈 \n"); printf("\n 2 入栈 \n");

printf("\n 3 出栈 \n");

printf("\n 4 取栈顶元素 \n"); printf("\n 5 置空链栈 \n");

printf("\n 6 结束程序运行 \n"); printf("\n----------------------------------\n");

printf("请输入您的选择(1,2,3,4,5,6)");

scanf("%d",&cord);

printf("\n");

switch(cord)

{

case 1:

{initstack(s);

disp(s);

}break;

case 2:

{printf("输入将要压入链栈的数据的个数:n=");

scanf("%d",&n);

printf("依次将%d个数据压入链栈:\n",n);

for(i=1;i

{

scanf("%d",&a);

pushlstack(s,a);

}

disp(s);

}break;

case 3:

{

printf("\n出栈操作开始!\n");

printf("输入将要出栈的数据个数:m=");

scanf("%d",&m);

for(i=1;i

{

printf("\n第%d次出栈的数据是:%d\n",i,poplstack(s)); }break;

}

case 4:

{

printf("\n\n链栈的栈顶元素为:%d\n\n",stacktop(s)); }break;

case 5:

{

setempty(s);

disp(s);

}break;

case 6:exit(0);

}

}while(cord

}

实验总结:


相关内容

  • 谈顺序存储与链式存储的异同
  • 谈顺序存储与链式存储的异同 摘要: 顺序存储与链式存储的应用范围较为广泛.顺序存储就是用一组地址连续的存储单元依次存储该线性表中的各个元素,由于表中各个元素具有相同的属性,所以占用的存储空间相同,而链式存储无需担心容量问题,读写速度相对慢些,由于要存储下一个数据的地址所以需要的存储空间比顺序存储大. ...

  • [数据结构]教学大纲
  • <数据结构>教学大纲 Data Structure 课程编号:J6110G0003 课程性质:学科基础课程 适用专业:计算机科学与技术.网络工程.数字媒体技术 先行课:计算机科学导论.离散数学.高级语言程序设计: 后续课:无 . 学分数:5 主讲教师:任燕.王命延.冯豫华.周石林.王玮立 ...

  • 第1章数据结构与算法笔试题考点分析
  • 1算法 考试的内容: 1.1 算法的基本概念 1.算法的概念(必记) : 是指解题方案的准确而完整的描述. 分析:要用计算机实现某一任务时,先应设计出一整套解决问题的指导方案,然后具体实现.整套的指导方案称之为算法,而具体的实现称之为程序.并且在设计指导方案时,可不用过多考虑到实现程序的具体细节(即 ...

  • 数据结构大纲
  • 数据结构大纲 第1章 数据结构概述 数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作的学科.数据结构主要有三个方面的内容: 数据的逻辑结构.数据的存储结构和对数据的算法. 逻辑结构:反映数据之间的逻辑关系,是对数据之间关系的描述,主要有集合.线性表.树.图等四种结 ...

  • 数据结构研究
  • 摘 要: "数据结构"是一门专业技术基础课.它的教学要求是:学会分析研究计算机加工 的数据结构的特征,以便为应用涉及的数据选择适当的逻辑结构.存储结构及其 相应的算法,并初步掌握算法的时间分析和空间分析的技术.另一方面,本课程 的学习过程也是复杂程序设计的训练过程,要求学生编写的 ...

  • 数据结构与算法面试总结
  • 一. 算法的基本概念 计算机解题的过程实际上是在实施某种算法,这种算法称为计算机算法. 1. 算法的基本特征:可行性,确定性,有穷性,拥有足够的情报. 2. 算法的基本要素:算法中对数据的运算和操作.算法的控制结构. 3. 算法设计的基本方法:列举法.归纳法.递推.递归.减半递推技术.回溯法. 4. ...

  • 线性表习题
  • 线性表习题 一 判断题 1.线性表的逻辑顺序与存储顺序总是一致的.× 2.顺序存储的线性表可以按序号随机存取. 3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动. × 4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同 ...

  • 公共基础教材
  • 第一章数据结构与算法 1.1 算法 ★算法:是指解题方案的准确而完整的描述. 算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计. 算法的基本特征:是一组严谨地定义运算顺序的规则,每一个规则都是有效的,是明确的,此顺序将在有限的次数下终止. ★特征包括: (1)可行性: (2)确定性, ...

  • 单链表.双链表.循环链表和静态链表的习题
  • 单链表.双链表.循环链表和静态链表的习题 一.单项选择题 1. 关于线性表的顺序存储结构和链式存储结构的描述中,正确的是( ). Ⅰ. 线性表的顺序存储结构优于其链式存储结构 Ⅱ. 链式存储结构比顺序存储结构能更方便地表示各种逻辑结构 Ⅲ. 如频繁使用插入和删除结点操作,顺序存储结构更优于链式存储结 ...