栈-队列的顺序-链式储存结构(数据结构试验报告)
栈的实验报告结论(3篇)

第1篇一、实验目的1. 理解栈的基本概念和操作;2. 掌握栈的顺序存储和链式存储实现方法;3. 熟悉栈在程序设计中的应用。
二、实验内容1. 栈的顺序存储结构实现;2. 栈的链式存储结构实现;3. 栈的基本操作(入栈、出栈、判空、求栈顶元素);4. 栈在程序设计中的应用。
三、实验方法1. 采用C语言进行编程实现;2. 对实验内容进行逐步分析,编写相应的函数和程序代码;3. 通过运行程序验证实验结果。
四、实验步骤1. 实现栈的顺序存储结构;(1)定义栈的结构体;(2)编写初始化栈的函数;(3)编写入栈、出栈、判空、求栈顶元素的函数;(4)编写测试程序,验证顺序存储结构的栈操作。
2. 实现栈的链式存储结构;(1)定义栈的节点结构体;(2)编写初始化栈的函数;(3)编写入栈、出栈、判空、求栈顶元素的函数;(4)编写测试程序,验证链式存储结构的栈操作。
3. 栈在程序设计中的应用;(1)实现一个简单的四则运算器,使用栈进行运算符和操作数的存储;(2)实现一个逆序输出字符串的程序,使用栈进行字符的存储和输出;(3)编写测试程序,验证栈在程序设计中的应用。
五、实验结果与分析1. 顺序存储结构的栈操作实验结果:(1)入栈操作:在栈未满的情况下,入栈操作成功,栈顶元素增加;(2)出栈操作:在栈非空的情况下,出栈操作成功,栈顶元素减少;(3)判空操作:栈为空时,判空操作返回真,栈非空时返回假;(4)求栈顶元素操作:在栈非空的情况下,成功获取栈顶元素。
2. 链式存储结构的栈操作实验结果:(1)入栈操作:在栈未满的情况下,入栈操作成功,链表头指针指向新节点;(2)出栈操作:在栈非空的情况下,出栈操作成功,链表头指针指向下一个节点;(3)判空操作:栈为空时,判空操作返回真,栈非空时返回假;(4)求栈顶元素操作:在栈非空的情况下,成功获取栈顶元素。
3. 栈在程序设计中的应用实验结果:(1)四则运算器:成功实现加、减、乘、除运算,并输出结果;(2)逆序输出字符串:成功将字符串逆序输出;(3)测试程序:验证了栈在程序设计中的应用。
数据结构栈和队列实验报告

数据结构栈和队列实验报告实验报告:数据结构栈和队列一、实验目的1.了解栈和队列的基本概念和特点;2.掌握栈和队列的基本操作;3.掌握使用栈和队列解决实际问题的方法。
二、实验内容1.栈的基本操作实现;2.队列的基本操作实现;3.使用栈和队列解决实际问题。
三、实验原理1.栈的定义和特点:栈是一种具有后进先出(LIFO)特性的线性数据结构,不同于线性表,栈只能在表尾进行插入和删除操作,称为入栈和出栈操作。
2.队列的定义和特点:队列是一种具有先进先出(FIFO)特性的线性数据结构,不同于线性表,队列在表头删除元素,在表尾插入元素,称为出队和入队操作。
3.栈的基本操作:a.初始化:建立一个空栈;b.入栈:将元素插入栈的表尾;c.出栈:删除栈表尾的元素,并返回该元素;d.取栈顶元素:返回栈表尾的元素,不删除。
4.队列的基本操作:a.初始化:建立一个空队列;b.入队:将元素插入队列的表尾;c.出队:删除队列表头的元素,并返回该元素;d.取队头元素:返回队列表头的元素,不删除。
四、实验步骤1.栈的实现:a.使用数组定义栈,设置栈的大小和栈顶指针;b.实现栈的初始化、入栈、出栈和取栈顶元素等操作。
2.队列的实现:a.使用数组定义队列,设置队列的大小、队头和队尾指针;b.实现队列的初始化、入队、出队和取队头元素等操作。
3.使用栈解决实际问题:a.以括号匹配问题为例,判断一个表达式中的括号是否匹配;b.使用栈来实现括号匹配,遍历表达式中的每个字符,遇到左括号入栈,遇到右括号时将栈顶元素出栈,并判断左右括号是否匹配。
4.使用队列解决实际问题:a.以模拟银行排队问题为例,实现一个简单的银行排队系统;b.使用队列来模拟银行排队过程,顾客到达银行时入队,处理完业务后出队,每个顾客的业务处理时间可以随机确定。
五、实验结果与分析1.栈和队列的基本操作实现:a.栈和队列的初始化、入栈/队、出栈/队以及取栈顶/队头元素等操作均能正常运行;b.栈和队列的时间复杂度均为O(1),操作效率很高。
数据结构栈与队列的实验报告

数据结构栈与队列的实验报告实验概述本次实验的目的是通过对栈和队列进行实现和应用,加深对数据结构中的栈和队列的理解和巩固操作技能。
栈和队列作为常见的数据结构在程序开发中得到了广泛的应用,本次实验通过 C++ 语言编写程序,实现了栈和队列的基本操作,并对两种数据结构进行了应用。
实验内容1. 栈的实现栈是一种先进后出的数据结构,具有后进先出的特点。
通过使用数组来实现栈,实现入栈、出栈、输出栈顶元素和清空栈等操作。
对于入栈操作,将元素插入到数组的栈顶位置;对于出栈操作,先将数组的栈顶元素弹出,再使其下移,即将后面的元素全部向上移动一个位置;输出栈顶元素则直接输出数组的栈顶元素;清空栈则将栈中所有元素全部清除即可。
3. 栈和队列的应用利用栈和队列实现八皇后问题的求解。
八皇后问题,是指在8×8 的国际象棋盘上放置八个皇后,使得任意两个皇后都不能在同一行、同一列或者同一对角线上。
通过使用栈来保存当前八皇后的位置,逐个放置皇后并检查是否有冲突。
如果当前位置符合要求,则将位置保存到栈中,并继续查询下一个皇后的位置。
通过使用队列来进行八数码问题的求解。
八数码问题,是指在3×3 的矩阵中给出 1 至 8 的数字和一个空格,通过移动数字,最终将其变为 1 2 3 4 5 6 7 8 空的排列。
通过使用队列,从初始状态出发,枚举每种情况,利用队列进行广度遍历,逐一枚举状态转移,找到对应的状态后进行更新,周而复始直到找到正确的答案。
实验结果通过使用 C++ 语言编写程序,实现了栈和队列的基本操作,并对八皇后和八数码问题进行了求解。
程序执行结果如下:栈和队列实现的基本操作都能够正常进行,并且运行效率较高。
栈和队列的实现方便了程序编写并加速了程序运行。
2. 八皇后问题的求解通过使用栈来求解八皇后问题,可以得到一组成立的解集。
图中展示了求解某一种八皇后问题的过程。
从左到右是棋盘的列数,从上到下是棋盘的行数,通过栈的操作,求出了在棋盘上符合不同要求(不在同一行、同一列和斜线上)的八皇后位置。
数据结构栈和队列实验报告

数据结构栈和队列实验报告数据结构栈和队列实验报告1.实验目的本实验旨在通过设计栈和队列的数据结构,加深对栈和队列的理解,并通过实际操作进一步掌握它们的基本操作及应用。
2.实验内容2.1 栈的实现在本实验中,我们将使用数组和链表两种方式实现栈。
我们将分别实现栈的初始化、入栈、出栈、判断栈是否为空以及获取栈顶元素等基本操作。
通过对这些操作的实现,我们可将其用于解决实际问题中。
2.2 队列的实现同样地,我们将使用数组和链表两种方式实现队列。
我们将实现队列的初始化、入队、出队、判断队列是否为空以及获取队头元素等基本操作。
通过对这些操作的实现,我们可进一步了解队列的特性,并掌握队列在实际问题中的应用。
3.实验步骤3.1 栈的实现步骤3.1.1 数组实现栈(详细介绍数组实现栈的具体步骤)3.1.2 链表实现栈(详细介绍链表实现栈的具体步骤)3.2 队列的实现步骤3.2.1 数组实现队列(详细介绍数组实现队列的具体步骤)3.2.2 链表实现队列(详细介绍链表实现队列的具体步骤)4.实验结果与分析4.1 栈实验结果分析(分析使用数组和链表实现栈的优缺点,以及实际应用场景)4.2 队列实验结果分析(分析使用数组和链表实现队列的优缺点,以及实际应用场景)5.实验总结通过本次实验,我们深入了解了栈和队列这两种基本的数据结构,并利用它们解决了一些实际问题。
我们通过对数组和链表两种方式的实现,进一步加深了对栈和队列的理解。
通过实验的操作过程,我们也学会了如何设计和实现基本的数据结构,这对我们在日后的学习和工作中都具有重要意义。
6.附件6.1 源代码(附上栈和队列的实现代码)6.2 实验报告相关数据(附上实验过程中所产生的数据)7.法律名词及注释7.1 栈栈指的是一种存储数据的线性数据结构,具有后进先出(LIFO)的特点。
栈的操作主要包括入栈和出栈。
7.2 队列队列指的是一种存储数据的线性数据结构,具有先进先出(FIFO)的特点。
数据结构栈和队列实验报告

3检查一遍已输入的程序是否有错〔包括输入时输错的和编程中的错误〕,如发现有错,及时改正。
4进展编译和连接。如果在编译和连接过程中发现错误,频幕上会出现"报错信息〞,根据提示找到出错位置和原因,加以改正。再进展编译,如此反复直到不出错为止。
5运行程序并分析运行结果是否合理。在运行是要注意当输入不同的数据时所得结果是否正确,应运行屡次,分别检查在不同情况下结果是否正确。
s->ne*t=NULL;
}
void DestroyStack(LiStack *&s)//销毁栈
{LiStack *p=s,*q=s->ne*t;
while (q!=NULL)
{free(p);
p=q;
q=p->ne*t;
}
free(p);//此时p指向尾节点,释放其空间
}
bool StackEmpty(LiStack *s)//判断栈是否为空
printf("栈s的根本运算如下:\n");
printf(" (1)初始化栈s\n");
InitStack(s);
printf(" (2)栈为%s\n",(StackEmpty(s)""空":"非空"));
printf(" (3)依次进栈元素a,b,c,d,e\n");
Push(s,'a');Байду номын сангаас
Push(s,'b');
#include <stdio.h>
#include <malloc.h>
#define Ma*Size 100
栈-队列的顺序-链式储存结构(数据结构试验报告)

数据结构实验报告班级:计学号:姓名:设计日期:西安计算机学院实验题目1)栈的顺序存储结构2)栈的链式存储结构3)队列的链式存储结构4)队列的循环存储结构2.需求分析本演示程序用C语言编写,完成栈和列的初始化,入栈、出栈、输出操作。
1)对于顺序栈,入栈时要先判断栈是否满了,栈满不能入栈,否则出现空间溢出;在进栈出栈和读取栈顶时先判栈是否为空,为空时不能操作。
2)在一个链队表中需设定两个指针分别指向队列的头和尾。
3)队列的存储结构:注意要判断队满和队空。
4)程序所能达到的功能:完成栈的初始化,入栈,出栈和输出操作;完成队列的初始化,入队列,出队列和输出操作。
3.概要设计本程序包含1、栈的顺序存储结构包含的函数:1)主函数main()2)入栈函数Push()3)出栈函数Pop()2、栈的链式存储结构包含的函数:1)主函数main()2)入栈函数PushStack()3)退栈函数PopStack()4)取栈顶元素函数Getstack top()3、队列的链式存储结构所包含的函数:1)主函数main()2)入队函数EnQueue()3)出队函数DeQueue()4 队列的循环所包含的函数:1)主函数main()2)初始化循环函数CircSeqQueue()3)入队函数EnQueue()4)出队函数DeQueue()5)取队首元素函数GetFront()4.详细设计1)栈的顺序存储结构#include<stdio.h>#include<stdlib.h>#include<conio.h>#define MAXSIZE 20typedef int datatype;typedef struct{ datatype elem[MAXSIZE];int top;}SeqStack;int init(SeqStack *s){ s->top=-1; return 1;}void print(SeqStack *s){char ch; int i;if(s->top==-1)printf("\n 栈已空.");else{i=s->top;while(i!=-1){printf("\n data=%d",s->elem[i]); i--;}}printf("\n 按回车继续");ch=getch();}void push(SeqStack *s,datatype x){if(s->top==MAXSIZE-1) printf("\n 栈已满!");else s->elem[++s->top]=x;}datatype pop(SeqStack*s){datatype x;if(s->top==-1){printf("\n 栈已空! "); x=-1;}else{x=s->elem[s->top--];}return(x);}void main(){SeqStack s; int k; datatype x;if(init(&s)){do {printf("\n\n\n");printf("\n***************************************");printf("\n\n 1. x进栈");printf("\n\n 2.出栈返回其值");printf("\n\n 3 结束");printf("\n***************************************");printf("\n 请选择(123)");scanf("%d",&k);switch(k){case 1:{printf("\n 请输入进栈整数X=?");scanf("%d",&x);push(&s,x);print(&s);}break;case 2:{ x=pop(&s);printf("\n 出栈元素:%d",x);print(&s);}break;case 3:exit(0);}printf("n---------");}while(k>=1 &&k<3);printf("\n 按回车返回");getch();}elseprintf("\n 初始化失败!\n");}2).栈的链式存储结构#include<stdio.h>#include<stdlib.h>typedef struct SNode{int data;struct SNode*next;}SNode,*LinkStack;LinkStack top;LinkStack PushStack(LinkStack top,int x)//入栈{LinkStack s;s=(LinkStack)malloc(sizeof(SNode));s->data=x;s->next=top;top=s;return top;}LinkStack PopStack(LinkStack top) //退栈{LinkStack p;if(top!=NULL){p=top;top=top->next;free(p);printf("退栈已完成\n");return top;}elseprintf("栈是空的,无法退栈!\n");return 0;}int GetStackTop(LinkStack top) //取栈顶元素{return top->data;}bool IsEmpty(){return top==NULL?true:false;}void Print(){SNode*p;p=top;if(IsEmpty()){printf("The stack is empty!\n");return;}while(p){printf("%d ",p->data);p=p->next;}printf("\n");}void main(){int x,a,b;char m;do{printf("\n");printf(" 链栈的基本操作\n");printf(" \n");printf(" 1.置空栈\n");printf(" 2.进栈\n");printf(" 3.退栈\n");printf(" 4.取栈顶元素\n");printf(" 5.退出程序\n");printf("\n 请选择一个数字(1 2 3 4 5):");scanf("%c",&m);switch(m){case '1':{top=NULL;printf("\n栈已置空!");break;}case '2':{printf("请输入要进栈的元素个数是:");scanf("%d",&a);printf("\n请输入要进栈的%d个元素:",a);for(b=0;b<a;b++){scanf("%d",&x);top=PushStack(top,x);}printf("进栈已完成!\n");printf("\n输出栈为:");Print();}break;case '3':{printf("\n操作之前的输出栈为:");Print();top=PopStack(top);printf("\n操作过后的输出栈为:");Print();}break;case '4':{printf("\n输出栈为:");Print();if(top!=NULL)printf("\n栈顶元素是:%d\n",GetStackTop(top));elseprintf("\n栈是空的,没有元素!");}break;case '5':break;default:printf("\n输入的字符不对,请重新输入!");break;}getchar();}while(m!='5'); }运算结果:3)队列的链式存储结构#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<stdio.h>#include<stdlib.h>#include<math.h>typedef int dataType;typedef struct node{ dataType data;struct node *next;}QNode;typedef struct{QNode *front,*rear;}LQueue;/*初始化*/int init(LQueue *q){if((q->front=(QNode *)malloc(sizeof(QNode)))==NULL) return 0;q->rear=q->front;q->front->next=NULL;return 1;}/*出队*/void print(LQueue Q){ QNode *p; char ch;p=Q.front->next;while(p!=NULL){printf("\n%d",p->data); p=p->next; } printf("\n 按回车键继续。
【精品】数据结构栈和队列实验报告

【精品】数据结构栈和队列实验报告实验目的:1.了解栈和队列的概念和基本操作。
2.熟练掌握按顺序存储、链式存储、循环存储结构。
3.掌握栈和队列的应用。
实验环境:操作系统:Windows 7编程软件:Dev-C++实验内容:1.用数组作为栈的存储结构,并以学生管理系统为例,实现“进栈”、“出栈”等基本操作。
先用 typedef struct 学生信息实现一个结构体类型,包含了学号、姓名、性别、出生日期、专业等成员。
typedef struct student{char num[10]; //学号char name[10]; //姓名char sex[2]; //性别int year; //出生年份int major; //专业}StuType;定义一个常量 MAXSIZE 来代表栈的最大空间,建立一个顺序栈。
初始化栈:void init_seqstack(SeqStack &p){p.top = -1;}判断是否为空:进栈操作:bool push_seqstack(SeqStack &p,StuType e){if(p.top==MAXSIZE-1)return 0;p.top++;p.data[p.top]=e;return 1;}定义一个链表结构体类型以存放队列,包含首节点指针和尾结点指针。
typedef struct link_queue{ComType data;struct QueueNode *next;}QueueNode;出队操作:bool de_queue(queue &q,ComType &qdata){QueueNode *p=q.front->next;if(q.front==q.rear)return false;qdata=p->data;q.front->next=p->next;if(q.rear==p)q.rear=q.front;free(p);return true;}实验结果:通过本次实验,我可以熟练掌握栈和队列的基本概念和操作,并能够在相应的程序设计中熟练操作,达到掌握栈和队列的目标。
数据结构栈和队列实验报告

num=Pop(top);
printf("%d",num);
}
printf("\n");
}
void Push(LinkStack *top,DataType x) /*压栈操作*/
i--;
}
q->rear->next=p;
q->rear=p;
}
void PutQ(LinkQueue *q,int i,int t)
{
int j=t-i-1;
p=q->front->next;
while(j){printf(" ");j--;}
scanf("%d",&t);
top=(LinkStack*)malloc(sizeof(LinkStack));
IniStack(top);
while(num!=0){
Push(top,num%t);
num=num/t;
}
printf("转化后的数为:");
数据结构栈和队列实验报告
(以下写实验内容、分析与程序清单、调试报告等)
一、 实验目的
1.掌握栈这种数据结构特性及其主要存储结构,并能在现实生活中灵活运用。
2.掌握队列这种数据结构特性及其主要存储结构并能在现实生活中灵活运用。
}
}
return 0;
数据结构栈与队列的实验报告

数据结构栈与队列实验报告学院:数学与计算机学院班级:计算机科学与技术姓名:***学号:************实验三栈与队列一、实验目的:(1)熟练掌握栈和队列的结构以及这两种数据结构的特点、栈与队列的基本操作。
(2)能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空的判断条件及描述方法;(3)熟练掌握链队列和循环队列的基本运算,并特别注意队列满和队列空的判断条件和描述方法;(4)掌握栈的应用;二、实验要求:(1) 给出程序设计的基本思想、原理和算法描述。
(2) 对源程序给出注释。
(3) 记录程序的运行结果,并结合程序进行分析。
三、程序设计的基本思想、原理和算法描述:四、实验内容:1、利用栈的基本操作将一个十进制的正整数转换成R进制数据,并将其转换结果输出。
#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define stack_init_size 100#define stackincrement 10typedef struct sqstack {int *base;int *top;int stacksize;} sqstack;int StackInit(sqstack *s){ s->base=(int *)malloc(stack_init_size *sizeof(int));if(!s->base)return 0;s->top=s->base;s->stacksize=stack_init_size;return 1;}int Push(sqstack *s,int e){if(s->top-s->base>=s->stacksize){s->base=(int *)realloc(s->base,(s->stacksize+stackincrement)*sizeof(int));if(!s->base)return 0;s->top=s->base+s->stacksize;s->stacksize+=stackincrement;}*(s->top++)=e;return e;}int Pop(sqstack*s,int e){if(s->top==s->base)return0;e=*--s->top;return e;}int stackempty(sqstack*s){if(s->top==s->base){return1;}else{return0;}}int conversion(sqstack*s){int n,e=0,flag=0;printf("输入要转化的十进制数:\n");scanf("%d",&n);printf("要转化为多少进制:2进制、8进制、16进制填数字!\n"); scanf("%d",&flag);printf("将十进制数%d转化为%d进制是:\n",n,flag);while(n){Push(s,n%flag);n=n/flag;}while(!stackempty(s)){e=Pop(s,e);switch(e){case10:printf("A");break;case11:printf("B");break;case 12: printf("C");break;case 13: printf("D");break;case 14: printf("E");break;case 15: printf("F");break;default: printf("%d",e);}}printf("\n");return 0; }int main(){sqstack s;StackInit(&s);conversion(&s);return 0;}2、回文数判断#include<stdio.h>#include<string.h>#define MAX 50#define FALSE 0#define TURE 1//定义栈typedef struct{char elem[MAX];int top;}SeqStack;//定义循环队列typedef struct{char element[MAX];int front;int rear;}SeqQuene;//初始化栈void InitStack(SeqStack *S){S->top = -1;//构造一个空栈}//入栈int Push(SeqStack *S,char x,int cnt) {if(S->top == cnt-1)return(FALSE);S->top++;S->elem[S->top] = x;return(TURE);}//出栈int Pop(SeqStack * S,char * x){if(S->top == -1)return(FALSE);else{*x = S->elem[S->top];S->top--;return(TURE);}}//初始化队列void InitQuene(SeqQuene *Q){Q->front = Q->rear = 0;}//入队int EnterQuene(SeqQuene *Q,char x,int cnt) {if((Q->rear+1)%(cnt+1) == Q->front)return(FALSE);Q->element[Q->rear] = x;Q->rear = (Q->rear+1)%(cnt+1);return(TURE);}//出队int DeleteQuene(SeqQuene *Q,char *x,int cnt) {if(Q->front == Q->rear)return(FALSE);*x = Q->element[Q->front];Q->front = (Q->front+1)%(cnt+1);return(TURE);}//主函数void main(){int i,cnt,flag;SeqStack s;SeqQuene q;char a[MAX],b[MAX],c[MAX];flag=0;printf("请输入由*结束且小于%d的回文序列:\n",MAX); for(i = 0;i<MAX+1;i++){scanf("%c",&a[i]);if(a[i] == '*')break;}cnt = i;InitStack(&s);InitQuene(&q);for(i = 0;i<cnt;i++){EnterQuene(&q,a[i],cnt);Push(&s,a[i],cnt);}for(i = 0;i<cnt+1;i++){DeleteQuene(&q,&b[i],cnt);printf("%c",b[i]);}printf("\n");for(i = 0;i<cnt+1;i++){Pop(&s,&c[i]);printf("%c",c[i]);}printf("\n");for(i = 0;i<cnt+1;i++){if(b[i] == c[i])flag = 1;else{flag = 0;break;}}if(flag)printf("Right");elseprintf("Wrong");printf("\n"); }五、运行结果。
队列的存储实验报告(3篇)

第1篇一、实验目的1. 理解队列的基本概念和特点,掌握队列的存储结构。
2. 熟练掌握队列的顺序存储和链式存储结构,以及它们的基本操作。
3. 分析并比较队列顺序存储和链式存储结构的优缺点。
4. 利用队列解决实际问题,提高数据结构在实际应用中的运用能力。
二、实验内容1. 队列的顺序存储结构及操作(1)顺序存储结构队列的顺序存储结构是一种基于数组的存储方式,它利用一段连续的存储单元来存储队列中的元素。
队列的顺序存储结构具有以下特点:- 队列头指针指向队列的第一个元素。
- 队列尾指针指向队列的最后一个元素。
- 队列满的条件:队尾指针与队列头指针之差等于队列的最大长度。
- 队列空的条件:队尾指针等于队列头指针。
(2)队列的基本操作- 入队操作:将元素插入队列的队尾。
- 出队操作:删除队列的第一个元素。
- 判断队列是否为空。
- 判断队列是否已满。
2. 队列的链式存储结构及操作(1)链式存储结构队列的链式存储结构是一种基于链表的存储方式,它由多个节点组成,每个节点包含数据和指向下一个节点的指针。
队列的链式存储结构具有以下特点:- 队列头指针指向队列的第一个节点。
- 队列尾指针指向队列的最后一个节点。
- 队列空的条件:队头指针等于队尾指针。
(2)队列的基本操作- 入队操作:创建一个新节点,将其插入队列的队尾。
- 出队操作:删除队列的第一个节点。
- 判断队列是否为空。
- 判断队列是否已满。
三、实验步骤1. 设计并实现队列的顺序存储结构,实现队列的基本操作。
2. 设计并实现队列的链式存储结构,实现队列的基本操作。
3. 分析并比较队列顺序存储和链式存储结构的优缺点。
4. 利用队列解决实际问题,如模拟排队购票等。
四、实验结果与分析1. 队列的顺序存储结构实验结果表明,队列的顺序存储结构具有以下优缺点:优点:- 顺序存储结构简单,易于实现。
- 队列的基本操作具有常数时间复杂度 O(1)。
缺点:- 队列的顺序存储结构存在假溢出问题,当队列未满时,也可能无法插入元素。
数据结构实验报告_栈(3篇)

第1篇一、实验目的本次实验旨在通过实际操作,加深对栈这一数据结构的理解,掌握栈的基本操作,包括初始化、入栈、出栈、取栈顶元素、判栈空等。
同时,通过实验练习,提高编程能力和问题解决能力。
二、实验内容1. 栈的定义及特点2. 栈的顺序存储结构3. 栈的链式存储结构4. 栈的基本操作5. 栈的应用实例三、实验过程1. 栈的定义及特点栈是一种后进先出(LIFO)的数据结构,它只允许在一端进行插入和删除操作。
栈的顶元素总是最后被插入的元素,也是最先被删除的元素。
2. 栈的顺序存储结构顺序存储结构是使用数组来实现栈。
定义一个数组作为栈的存储空间,同时定义一个指针top来指示栈顶元素的位置。
3. 栈的链式存储结构链式存储结构是使用链表来实现栈。
定义一个节点结构体,其中包含数据和指向下一个节点的指针。
头节点作为栈顶元素。
4. 栈的基本操作(1)初始化:创建一个空栈,top指针指向栈底。
(2)入栈:将新元素插入到栈顶。
如果栈满,则进行扩容。
(3)出栈:删除栈顶元素,并将其返回。
如果栈空,则返回错误信息。
(4)取栈顶元素:返回栈顶元素的值,但不删除栈顶元素。
(5)判栈空:判断栈是否为空,如果为空,则返回true;否则,返回false。
5. 栈的应用实例(1)括号匹配检验:利用栈判断一个字符串中的括号是否匹配。
(2)算术表达式求值:利用栈实现算术表达式求值,包括四则运算和括号。
四、实验结果与分析1. 初始化栈初始化栈后,栈为空,top指针指向栈底。
2. 入栈操作将元素1、2、3依次入栈,栈的状态如下:```top -> 3 -> 2 -> 1```3. 出栈操作依次出栈元素,栈的状态如下:```top -> 2 -> 1```4. 取栈顶元素取栈顶元素2,栈的状态不变。
5. 判栈空当栈中只有一个元素时,判断栈为空,返回false。
6. 括号匹配检验对于字符串"((()))",括号匹配检验结果为true;对于字符串"(()))",括号匹配检验结果为false。
数据结构实验2——栈和队列实验报告

数据结构实验报告实验名称:实验2——栈和队列1 实验目的通过选择下面五个题目之一进行实现,掌握如下内容:进一步掌握指针、模板类、异常处理的使用掌握栈的操作的实现方法掌握队列的操作的实现方法学习使用栈解决实际问题的能力学习使用队列解决实际问题的能力2 实验内容利用栈结构实现八皇后问题。
八皇后问题19世纪著名的数学家高斯于1850年提出的。
他的问题是:在8*8的棋盘上放置8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线上。
请设计算法打印所有可能的摆放方法。
提示:1、可以使用递归或非递归两种方法实现2、实现一个关键算法:判断任意两个皇后是否在同一行、同一列和同一斜线上2. 程序分析主程序:#include<iostream>using namespace std;const int StackSize=8; //皇后的个数int num=0;template <class T>class SeqStack //定义顺序栈模板类{public:SeqStack(){top=-1;} //构造函数,初始化空栈void Push(T x); //入栈操作void Pop();//出栈操作void PlaceQueen(int row); //放置皇后bool Judgement();//判断是否符合条件void Print();//输出符合条件的皇后排列bool Empty(){if(top==-1) return true;else return false;}; //判断栈是否为空private:T data[StackSize]; //定义数组int top; //栈顶指针};template <class T>void SeqStack<T>::Push(T x) //入栈操作{if(top>=StackSize-1) throw"上溢";top++;//栈顶指针上移data[top]=x;}template <class T>void SeqStack<T>::Pop()//出栈操作{if(Empty()) throw"下溢";top--;//栈顶指针下移}template <class T>bool SeqStack<T>::Judgement()//判断该位置是否合适{for(int i=0;i<top;i++)if(data[top]==data[i]||(abs(data[top]-data[i]))==(top-i))//判断是否满足任意两个皇后不在同列同一斜线return false;return true;}template <class T>void SeqStack<T>::PlaceQueen(int row) //放置皇后{for (int i=0;i<StackSize;i++){Push(i); //入栈if (Judgement())//判断位置是否合适{if (row<StackSize-1)PlaceQueen(row+1); //如果合适满足条件则放置一个皇后,递归调用else{num++;//不满足条件则到下一行Print();//输出符合条件的皇后}}Pop();//出栈}}template <class T>void SeqStack<T>::Print()//输出皇后函数{cout<<"NO."<<num<<":"<<endl; for(int i=0;i<StackSize;i++){for(int j=0;j<data[i];j++){cout<<"□";}cout<<"■";for(int j=StackSize-1;j>data[i];j--){cout<<"□";}cout<<endl;}cout<<endl;}void main(){SeqStack<int> Queen;Queen.PlaceQueen(0);cout<<"总共有"<<num<<"种摆放方法。
数据结构栈和队列实验报告

数据结构栈和队列实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构中的栈和队列的基本概念、操作原理以及实际应用。
通过编程实现栈和队列的相关操作,加深对其特性的认识,并能够运用栈和队列解决实际问题。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验原理(一)栈栈(Stack)是一种特殊的线性表,其操作遵循“后进先出”(Last In First Out,LIFO)的原则。
可以将栈想象成一个只有一端开口的容器,元素只能从开口端进出。
入栈操作(Push)将元素添加到栈顶,出栈操作(Pop)则从栈顶移除元素。
(二)队列队列(Queue)也是一种线性表,但其操作遵循“先进先出”(FirstIn First Out,FIFO)的原则。
队列就像是排队买票的队伍,先到的人先接受服务。
入队操作(Enqueue)将元素添加到队列的末尾,出队操作(Dequeue)则从队列的头部移除元素。
四、实验内容(一)栈的实现与操作1、定义一个栈的数据结构,包含栈顶指针、存储元素的数组以及栈的最大容量等成员变量。
2、实现入栈(Push)操作,当栈未满时,将元素添加到栈顶,并更新栈顶指针。
3、实现出栈(Pop)操作,当栈不为空时,取出栈顶元素,并更新栈顶指针。
4、实现获取栈顶元素(Top)操作,返回栈顶元素但不进行出栈操作。
5、实现判断栈是否为空(IsEmpty)和判断栈是否已满(IsFull)的操作。
(二)队列的实现与操作1、定义一个队列的数据结构,包含队头指针、队尾指针、存储元素的数组以及队列的最大容量等成员变量。
2、实现入队(Enqueue)操作,当队列未满时,将元素添加到队尾,并更新队尾指针。
3、实现出队(Dequeue)操作,当队列不为空时,取出队头元素,并更新队头指针。
4、实现获取队头元素(Front)操作,返回队头元素但不进行出队操作。
5、实现判断队列是否为空(IsEmpty)和判断队列是否已满(IsFull)的操作。
数据结构栈和队列实验报告

数据结构栈和队列实验报告数据结构栈和队列实验报告1.引言本实验旨在通过设计和实现栈和队列的数据结构,掌握栈和队列的基本操作,并进一步加深对数据结构的理解和应用。
2.实验目的本实验的主要目标包括:________●掌握栈和队列的数据结构实现。
●熟悉栈和队列的基本操作:________入栈、出栈、入队、出队。
●理解栈和队列的应用场景,并能够灵活运用。
3.实验原理3.1 栈栈是一种特殊的数据结构,它采用“后进先出”的方式对元素进行操作。
栈的主要操作包括入栈和出栈,入栈将元素压入栈顶,出栈将栈顶元素弹出。
3.2 队列队列也是一种特殊的数据结构,它采用“先进先出”的方式对元素进行操作。
队列的主要操作包括入队和出队,入队将元素放入队列尾部,出队将队列头部的元素移除。
4.实验过程4.1 栈的实现a. 定义栈的数据结构在实现栈之前,首先要定义栈的数据结构,包括数据存储结构和相关操作方法。
b. 定义入栈操作入栈操作将元素压入栈顶。
c. 定义出栈操作出栈操作将栈顶元素弹出。
4.2 队列的实现a. 定义队列的数据结构在实现队列之前,首先要定义队列的数据结构,包括数据存储结构和相关操作方法。
b. 定义入队操作入队操作将元素放入队列尾部。
c. 定义出队操作出队操作将队列头部的元素移除。
5.实验结果与分析将栈和队列的数据结构实现后,可以进行测试和验证。
通过将不同类型的元素入栈和入队,然后再进行出栈和出队操作,最后检查栈和队列的状态,验证其正确性。
6.实验总结本实验通过设计和实现栈和队列的数据结构,掌握了栈和队列的基本操作。
并通过对栈和队列的应用,加深了对数据结构的理解和应用。
附件:________无法律名词及注释:________无。
栈和队列实验报告

栈和队列实验报告引言:计算机科学中的数据结构是解决问题的关键。
栈和队列这两种常用的数据结构,无疑在许多实际应用中起着重要的作用。
本篇报告旨在探讨栈和队列的实验结果,并展示它们的实际应用。
一、栈的实验结果及应用1. 栈的实验结果在实验中,我们设计了一个基于栈的简单计算器,用于实现基本的四则运算。
通过栈的先进后出(Last In First Out)特性,我们成功实现了表达式的逆波兰表示法,并进行了正确的计算。
实验结果表明,栈作为一个非常有效的数据结构,可以很好地处理栈内数据的存储和检索。
2. 栈的应用栈在计算机科学中有许多实际应用。
其中之一是程序调用的存储方式。
在程序调用过程中,每个函数的返回地址都可以通过栈来保存和恢复。
另一个应用是浏览器的历史记录。
浏览器中每个访问网页的URL都可以通过栈来存储,以便用户能够追溯他们之前访问的网页。
二、队列的实验结果及应用1. 队列的实验结果在实验中,我们模拟了一个简单的出租车调度系统,利用队列的先进先出(First In First Out)特性实现乘客的排队和叫车。
实验结果表明,队列作为一个具有高效性和可靠性的数据结构,能够很好地处理排队问题。
2. 队列的应用队列在许多方面都有应用。
一个常见的应用是消息队列。
在网络通信中,消息队列可以用于存储和传递信息,确保按照特定的顺序进行处理。
另一个应用是操作系统的进程调度。
操作系统使用队列来管理各个进程的执行顺序,以实现公平和高效的资源分配。
三、栈和队列的比较及选择1. 效率比较栈和队列在实际应用中的效率取决于具体问题的需求。
栈的操作更简单,仅涉及栈顶元素的插入和删除,因此具有更高的执行速度。
而队列涉及到队头和队尾元素的操作,稍复杂一些。
但是,队列在某些问题中的应用更为广泛,例如调度问题和消息传递问题。
2. 如何选择在选择栈和队列时,需要根据实际问题的性质和需求进行综合考虑。
如果问题需要追溯历史记录或按照特定顺序进行处理,则应选择栈作为数据结构。
栈队列及其应用实验报告

一、实验目的1. 理解栈和队列的基本概念、特点及逻辑结构。
2. 掌握栈和队列的存储结构,包括顺序存储结构和链式存储结构。
3. 熟练掌握栈和队列的基本操作,如入栈、出栈、入队、出队等。
4. 分析栈和队列在实际问题中的应用,提高解决实际问题的能力。
二、实验内容1. 栈和队列的定义及特点2. 栈和队列的存储结构3. 栈和队列的基本操作4. 栈和队列的实际应用案例分析三、实验过程1. 栈和队列的定义及特点栈(Stack)是一种后进先出(Last In First Out,LIFO)的数据结构,它只允许在一端进行插入和删除操作。
栈的典型应用场景有函数调用、递归算法等。
队列(Queue)是一种先进先出(First In First Out,FIFO)的数据结构,它允许在两端进行插入和删除操作。
队列的典型应用场景有打印队列、任务队列等。
2. 栈和队列的存储结构(1)顺序存储结构栈和队列的顺序存储结构使用数组来实现。
对于栈,通常使用数组的一端作为栈顶,入栈操作在栈顶进行,出栈操作也在栈顶进行。
对于队列,通常使用数组的一端作为队首,入队操作在队尾进行,出队操作在队首进行。
(2)链式存储结构栈和队列的链式存储结构使用链表来实现。
对于栈,每个元素节点包含数据和指向下一个节点的指针。
入栈操作在链表头部进行,出栈操作在链表头部进行。
对于队列,每个元素节点包含数据和指向下一个节点的指针。
入队操作在链表尾部进行,出队操作在链表头部进行。
3. 栈和队列的基本操作(1)栈的基本操作- 入栈(push):将元素添加到栈顶。
- 出栈(pop):从栈顶删除元素。
- 获取栈顶元素(peek):获取栈顶元素,但不删除它。
- 判断栈空(isEmpty):判断栈是否为空。
(2)队列的基本操作- 入队(enqueue):将元素添加到队列尾部。
- 出队(dequeue):从队列头部删除元素。
- 获取队首元素(peek):获取队首元素,但不删除它。
栈的顺序存储实验报告(3篇)

第1篇一、实验目的1. 理解栈的基本概念和顺序存储结构;2. 掌握顺序栈的初始化、进栈、出栈、读栈顶元素等基本操作;3. 通过实际编程实现顺序栈,并验证其功能。
二、实验内容1. 栈的基本概念栈是一种特殊的线性表,它只允许在一端进行插入和删除操作。
栈的插入和删除操作遵循“后进先出”(LIFO)的原则。
2. 顺序栈的定义顺序栈使用数组来存储栈中的元素,数组的大小定义为MaxSize。
栈顶指针top 指向栈顶元素。
3. 顺序栈的基本操作(1)初始化:将栈顶指针top设置为-1,表示栈为空。
(2)进栈:判断栈是否已满,如果未满,则将新元素放入栈顶,并将栈顶指针top加1。
(3)出栈:判断栈是否为空,如果栈不为空,则将栈顶元素弹出,并将栈顶指针top减1。
(4)读栈顶元素:判断栈是否为空,如果栈不为空,则返回栈顶元素。
(5)栈的销毁:释放栈所占用的内存空间。
4. 实验步骤(1)定义栈的最大容量MaxSize;(2)创建顺序栈结构体;(3)实现顺序栈的基本操作函数;(4)编写主函数,测试顺序栈的功能。
1. 定义栈的最大容量MaxSize为100;2. 创建顺序栈结构体,包含数组data和栈顶指针top;3. 实现顺序栈的基本操作函数,包括初始化、进栈、出栈、读栈顶元素和栈的销毁;4. 编写主函数,创建顺序栈,进行进栈、出栈、读栈顶元素等操作,并输出结果。
四、实验结果与分析1. 初始化顺序栈初始化顺序栈后,栈顶指针top为-1,表示栈为空。
2. 进栈操作当向顺序栈中进栈元素时,首先判断栈是否已满。
如果栈未满,则将新元素放入栈顶,并将栈顶指针top加1。
3. 出栈操作当从顺序栈中出栈元素时,首先判断栈是否为空。
如果栈不为空,则将栈顶元素弹出,并将栈顶指针top减1。
4. 读栈顶元素操作当读取栈顶元素时,首先判断栈是否为空。
如果栈不为空,则返回栈顶元素。
5. 栈的销毁当栈不再需要时,释放栈所占用的内存空间。
实验结果表明,顺序栈的基本操作能够正常进行,验证了顺序栈的正确性。
实验报告(栈和队列)

附录A实验报告课程:数据结构(c语言)实验名称:栈和队列系别:数字媒体技术实验日期: 11月15号专业班级:组别:姓名:学号:实验报告内容验证性实验一、预习准备:实验目的:1. 掌握栈的顺序表示、链表表示以及相应操作的实现。
特别注意栈空和栈满的条件;2. 掌握队列的顺序表示、链表表示以及相应操作的实现。
特别是循环队列中队头与队尾指针的变化情况;实验环境:Widows操作系统、VC6.0实验原理:1.定义:栈:只允许在一端插入和删除的线性表,允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)。
队列: 是只允许在一端删除,在另一端插入的顺序表,允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear)。
2.特点:栈:后进先出(LIFO)队列:先进先出(FIFO, First In First Out)93. 表示:栈:(1)栈的数组表示—顺序栈(2)栈的链接表示—链式栈队列:(1)队列的顺序存储结构表示——循环队列(2)队列的链式表示—链队列实验内容和要求:分别使用顺序循环队列和堆栈以及链式队列和堆栈编写程序:判断一个字符序列是否是回文。
回文是指一个字符序列以中间字符为基准,两边字符完全相同。
如:“ABCDEDCBA”。
字符串长度小于等于80,用于判断回文的字符串不包括字符串的结束标记符。
基本要求:(1)字符序列可由用户从键盘随意输入;(2)可以连续测试多个字符序列,由用户决定退出测试程序;算法思想:判断回文的算法思想是:把字符串中的字符逐个分别存入队列和堆栈中,然后逐个出队列和退栈并比较出队列的数据元素和退栈的数据元素是否相等,若全部相等则该字符序列为回文,否则就不是回文。
基本操作:回文判断操作主要包括入栈和入队列、退栈和出队列操作。
在对堆栈以及队列进行操作之前,必须对队列以及堆栈进行初始化。
若使用链式堆栈和链式队列,操作结束后必须销毁链表。
二、实验过程:程序流程图:队列实验中的关键语句:(1) 构造空顺序栈算法Status InitStack ( SqStack &S ) {S.base = ( SElemType * ) malloc ( ST ACK_INIT_SIZE * sizeof ( SElemType ) );if ( ! S.base ) exit ( OVERFLOW );S.stacksize = ST ACK_INIT_SIZE;return OK;} // InitStack(2) 顺序栈出栈算法Status Pop ( SqStack &S, SElemType &e ) {if ( S.top = = S.base ) return ERROR;e = *--S.top; return OK;} // Pop(3)(4) 将元素压入顺序栈算法Status Push ( SqStack &S, SElemType e ){if ( S.top - S.base >= S.stacksize ) { S.base = ( SElemType * ) realloc ( S.base, ( S.stacksixe + ST ACKINCREMENT* sizeof ( SElemType ) );if ( ! S.base ) exit ( OVERFLOW );S.top = S.base + S.stacksize;S.stacksize += ST ACKINCREMENT;}*S.top ++= e;return OK;} // Push(4)在顺序队列尾插入新元素算法Status EnQueue ( SqQueue &Q; QElemType e ) {if ( ( Q.rear + 1 ) % MAXQSIZE = = Q.front )return ERRORQ.base[ Q.rear ] = e;Q.rear = ( Q.rear + 1 ) % MAXQSIZE;return OK;} // EnQueue(5)在顺序队列头删除旧元素算法Status DeQueue ( SqQueue &Q, QElemType &e ) {if ( Q.front = = Q.rear ) return ERROR;e = Q.base [ Q.front ]; Q.front = ( Q.front + 1 ) % MAXQSIZE; return OK;} // DeQueue(6)在链式队列尾插入新元素算法Status EnQueue ( LinkQueue &Q; QElemType e ) {p = ( QueuePtr ) malloc ( sizeof ( QNode ) );if ( ! p ) exit ( OVERFLOW ); p->data = e;p->next = NULL;Q.rear->next = p;Q.rear = p;return OK;} // EnQueue(7)在链式队列头删除旧元素算法Status DeQueue ( LinkQueue &Q, QElemType &e ) {if ( Q.front = = Q.rear ) return ERROR;p = Q.front->next;e = p->data;Q.front->next = p->next;if ( Q.rear = = p ) Q.rear = Q.front;free ( p );return OK;} // DeQueue编写及调试程序中遇到的问题及解决方法:(1)没有注意到可以验证多次问题。
数据结构栈和队列实验报告简版

数据结构栈和队列实验报告数据结构栈和队列实验报告1. 实验目的本实验的主要目的是通过实践的方式理解并掌握数据结构中栈和队列的概念、特点和基本操作。
通过实验,我们可以加深对栈和队列的理解,掌握栈和队列的应用方法,并能够设计和实现基于栈和队列的算法。
2. 实验内容本实验分为两个部分:栈的应用和队列的应用。
2.1 栈的应用栈是一种具有特定限制的线性表,它只允许在表的一端进行插入和删除操作,该端被称为栈顶。
栈的特点是“后进先出”(Last In First Out, LIFO),即最后进栈的元素最先出栈。
在本实验中,我们将实现一个简单的栈类,并应用栈来解决一个问题。
假设有一个字符串,其中包含了括号(圆括号、方括号和花括号),我们需要判断该字符串中的括号是否匹配。
为了达到这个目的,我们可以使用栈来辅助实现。
在实现过程中,我们可以定义一个栈来存储左括号,然后依次遍历字符串的每个字符。
当遇到左括号时,将其入栈;当遇到右括号时,判断栈顶是否是对应的左括号,如果是,则将栈顶元素出栈,否则说明括号不匹配。
最后,当栈为空时,表明所有的括号都匹配,否则说明括号不匹配。
2.2 队列的应用队列是一种具有特定限制的线性表,它只允许在表的一端进行插入操作(队尾),在表的另一端进行删除操作(队头)。
队列的特点是“先进先出”(First In First Out, FIFO),即最早进队列的元素最先出队列。
在本实验中,我们将实现一个简单的队列类,并应用队列来解决一个问题。
假设有一群人在排队等候,我们需要按照一定规则进行排队并输出结果。
为了达到这个目的,我们可以使用队列来进行模拟。
在实现过程中,我们可以定义一个队列来存储等候的人,然后依次将人入队列。
当需要输出结果时,我们可以通过队列的出队列操作,按照先后顺序依次输出到达队头的人。
通过使用队列,我们可以模拟人们排队等候的实际情况,并能够按照一定规则输出结果。
3. 实验过程本实验的实验过程如下:1. 首先,我们需要实现一个栈类。
数据结构栈和队列实验报告

数据结构栈和队列实验报告数据结构栈和队列实验报告引言:数据结构是计算机科学中非常重要的一个概念,它用于组织和存储数据,以便于程序的运行和管理。
栈和队列是数据结构中最基本的两种形式之一,它们在实际应用中有着广泛的应用。
本实验旨在通过实际操作和观察,深入理解栈和队列的特性和应用。
一、实验目的:1. 了解栈和队列的基本概念和特性;2. 掌握栈和队列的基本操作;3. 理解栈和队列在实际应用中的作用。
二、实验过程:本次实验我们使用Python语言来实现栈和队列的操作。
首先,我们定义了栈和队列的类,并编写了相应的操作方法。
1. 栈的实现:栈是一种后进先出(LIFO)的数据结构,类似于我们日常生活中的弹簧簿记本。
我们首先定义了一个栈类,其中包括了栈的初始化、入栈、出栈、获取栈顶元素等方法。
通过这些方法,我们可以对栈进行各种操作。
2. 队列的实现:队列是一种先进先出(FIFO)的数据结构,类似于我们日常生活中的排队。
我们同样定义了一个队列类,其中包括了队列的初始化、入队、出队、获取队首元素等方法。
通过这些方法,我们可以对队列进行各种操作。
三、实验结果:我们通过实验,成功实现了栈和队列的基本操作。
在测试过程中,我们发现栈和队列在实际应用中有着广泛的用途。
1. 栈的应用:栈在计算机系统中有着重要的作用,例如在函数调用中,每次函数调用时都会将返回地址和局部变量等信息存储在栈中,以便于函数执行完毕后能够正确返回。
此外,栈还可以用于表达式求值、括号匹配等场景。
2. 队列的应用:队列在操作系统中常用于进程调度,通过维护一个就绪队列,操作系统可以按照一定的策略选择下一个要执行的进程。
此外,队列还可以用于消息传递、缓冲区管理等场景。
四、实验总结:通过本次实验,我们深入了解了栈和队列的特性和应用。
栈和队列作为数据结构中最基本的两种形式,它们在计算机科学中有着广泛的应用。
在实际编程中,我们可以根据具体的需求选择合适的数据结构,以提高程序的效率和可读性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告班级:计学号:姓名:设计日期:西安计算机学院实验题目1)栈的顺序存储结构2)栈的链式存储结构3)队列的链式存储结构4)队列的循环存储结构2.需求分析本演示程序用C语言编写,完成栈和列的初始化,入栈、出栈、输出操作。
1)对于顺序栈,入栈时要先判断栈是否满了,栈满不能入栈,否则出现空间溢出;在进栈出栈和读取栈顶时先判栈是否为空,为空时不能操作。
2)在一个链队表中需设定两个指针分别指向队列的头和尾。
3)队列的存储结构:注意要判断队满和队空。
4)程序所能达到的功能:完成栈的初始化,入栈,出栈和输出操作;完成队列的初始化,入队列,出队列和输出操作。
3.概要设计本程序包含1、栈的顺序存储结构包含的函数:1)主函数main()2)入栈函数Push()3)出栈函数Pop()2、栈的链式存储结构包含的函数:1)主函数main()2)入栈函数PushStack()3)退栈函数PopStack()4)取栈顶元素函数Getstack top()3、队列的链式存储结构所包含的函数:1)主函数main()2)入队函数EnQueue()3)出队函数DeQueue()4 队列的循环所包含的函数:1)主函数main()2)初始化循环函数CircSeqQueue()3)入队函数EnQueue()4)出队函数DeQueue()5)取队首元素函数GetFront()4.详细设计1)栈的顺序存储结构#include<stdio.h>#include<stdlib.h>#include<conio.h>#define MAXSIZE 20typedef int datatype;typedef struct{ datatype elem[MAXSIZE];int top;}SeqStack;int init(SeqStack *s){ s->top=-1; return 1;}void print(SeqStack *s){char ch; int i;if(s->top==-1)printf("\n 栈已空.");else{i=s->top;while(i!=-1){printf("\n data=%d",s->elem[i]); i--;}}printf("\n 按回车继续");ch=getch();}void push(SeqStack *s,datatype x){if(s->top==MAXSIZE-1) printf("\n 栈已满!");else s->elem[++s->top]=x;}datatype pop(SeqStack*s){datatype x;if(s->top==-1){printf("\n 栈已空! "); x=-1;}else{x=s->elem[s->top--];}return(x);}void main(){SeqStack s; int k; datatype x;if(init(&s)){do {printf("\n\n\n");printf("\n***************************************");printf("\n\n 1. x进栈");printf("\n\n 2.出栈返回其值");printf("\n\n 3 结束");printf("\n***************************************");printf("\n 请选择(123)");scanf("%d",&k);switch(k){case 1:{printf("\n 请输入进栈整数X=?");scanf("%d",&x);push(&s,x);print(&s);}break;case 2:{ x=pop(&s);printf("\n 出栈元素:%d",x);print(&s);}break;case 3:exit(0);}printf("n---------");}while(k>=1 &&k<3);printf("\n 按回车返回");getch();}elseprintf("\n 初始化失败!\n");}2).栈的链式存储结构#include<stdio.h>#include<stdlib.h>typedef struct SNode{int data;struct SNode*next;}SNode,*LinkStack;LinkStack top;LinkStack PushStack(LinkStack top,int x)//入栈{LinkStack s;s=(LinkStack)malloc(sizeof(SNode));s->data=x;s->next=top;top=s;return top;}LinkStack PopStack(LinkStack top) //退栈{LinkStack p;if(top!=NULL){p=top;top=top->next;free(p);printf("退栈已完成\n");return top;}elseprintf("栈是空的,无法退栈!\n");return 0;}int GetStackTop(LinkStack top) //取栈顶元素{return top->data;}bool IsEmpty(){return top==NULL?true:false;}void Print(){SNode*p;p=top;if(IsEmpty()){printf("The stack is empty!\n");return;}while(p){printf("%d ",p->data);p=p->next;}printf("\n");}void main(){int x,a,b;char m;do{printf("\n");printf(" 链栈的基本操作\n");printf(" \n");printf(" 1.置空栈\n");printf(" 2.进栈\n");printf(" 3.退栈\n");printf(" 4.取栈顶元素\n");printf(" 5.退出程序\n");printf("\n 请选择一个数字(1 2 3 4 5):");scanf("%c",&m);switch(m){case '1':{top=NULL;printf("\n栈已置空!");break;}case '2':{printf("请输入要进栈的元素个数是:");scanf("%d",&a);printf("\n请输入要进栈的%d个元素:",a);for(b=0;b<a;b++){scanf("%d",&x);top=PushStack(top,x);}printf("进栈已完成!\n");printf("\n输出栈为:");Print();}break;case '3':{printf("\n操作之前的输出栈为:");Print();top=PopStack(top);printf("\n操作过后的输出栈为:");Print();}break;case '4':{printf("\n输出栈为:");Print();if(top!=NULL)printf("\n栈顶元素是:%d\n",GetStackTop(top));elseprintf("\n栈是空的,没有元素!");}break;case '5':break;default:printf("\n输入的字符不对,请重新输入!");break;}getchar();}while(m!='5'); }运算结果:3)队列的链式存储结构#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<stdio.h>#include<stdlib.h>#include<math.h>typedef int dataType;typedef struct node{ dataType data;struct node *next;}QNode;typedef struct{QNode *front,*rear;}LQueue;/*初始化*/int init(LQueue *q){if((q->front=(QNode *)malloc(sizeof(QNode)))==NULL) return 0;q->rear=q->front;q->front->next=NULL;return 1;}/*出队*/void print(LQueue Q){ QNode *p; char ch;p=Q.front->next;while(p!=NULL){printf("\n%d",p->data); p=p->next; } printf("\n 按回车键继续。
"); ch=getch();}/*入队*/int EnQueue(LQueue *q,dataType x){ QNode *p;if((p=(QNode*)malloc(sizeof(QNode)))==NULL) return 0; p->data=x; p->next=NULL;q->rear->next=p; q->rear=p;return 1;}/*出队*/dataType DeQueue(LQueue *q){ QNode *p; dataType x;if(q->front==q->rear){printf("\n 队列空"); x=-1;}else{p=q->front->next;q->front->next=p->next;x=p->data;free(p);if(q->front->next==NULL) q->rear=q->front;}return(x);}void main(){int k;dataType e,x;char ch;LQueue Q;init(&Q);do{printf("\n\n\n");printf("\n*******************************");printf("\n\n 1.元素入队列");printf("\n\n 2.出队列返回");printf("\n\n 3.结束");printf("\n*******************************");printf("\n 请选择(1,2,3)");scanf("%d",&k);switch(k){case 1:{printf("\n 进队e=?");scanf("%d",&e);EnQueue(&Q,e);print(Q);}break;case 2:{x=DeQueue(&Q);printf("\n 出队元素:%d",x);print(Q);}break;case 3:exit(0);}printf("\n--------------");}while(k>=1&&k<3);printf("\n 按回车键,返回。