数据结构实验二_栈与队列基本操作的编程实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40833790/article/details/89483773

一、实验题目

栈与队列基本操作的编程实现

二、实验要求

栈和队列基本操作的编程实现,掌握栈和队列的建立、进栈、出栈、进队、出队等基本操作的编程实现,也可以进一步编程实现实用的功能等操作,具体编程存储结构要求是顺序存储结构和链表存储结构,可以依次完成主要功能来体现功能的正确性,用菜单进行管理完成大部分功能,要求可以重复运行。白底黑字,标题栏为自己的个人信息。

三、运行效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、程序基本功能

1、顺序栈

对于顺序栈,我采用的是数组的方法。首先定义了一个一维数组dataarray[30],为了存储数据。还定义了一个栈顶top,初始化top=-1。

(1)数据进栈、出栈源码过程

void push()
{
	if(datanumber<=0||datanumber==top+1)  //判断栈的空间大小
	printf("入栈失败!\n");
	else
	{
	printf("向栈压入数据为:");
	top++;   							//栈顶先向后移动
	scanf("%d",&dataarray[top]);  			//再输入数据
	printf("目前栈的内容是:栈底 ->");
	for(int i=0;i<=top;i++)
	{
		printf("【%d】 ",dataarray[i]);		//显示栈
	}
	printf("<-栈顶\n"); 
	}
}

void pop()
{
	if(datanumber<=0||top==-1)  			//判断栈的空间大小
	printf("出栈失败!\n");
	else
	{
	printf("从栈中弹出数据:%d\n",dataarray[top]); //显示栈顶数据
	top--;   								//栈顶前移
	if(top==-1)
	printf("目前是空栈!\n");
	else
	{
	printf("目前栈的内容是:栈底-> ");
	for(int i=0;i<=top;i++)
	{
		printf("【%d】 ",dataarray[i]);		//显示栈
	}
	printf("<-栈顶\n");
	}
	}
}

(2)运行步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述 在这里插入图片描述
(3)运行结果
在这里插入图片描述
在这里插入图片描述

2、链栈

//首先定义结构体,链表头结点
struct link //定义链表结构体 
{
	int data; 
	struct link *next;
};
struct link linktop;//头结点,栈顶
struct link *newp;//新空间
struct link *lastp;//栈底
int datanumber=0;//记录栈空间

(1)数据进栈、出栈源码过程

void push()
{
	printf("输入准备进栈的数据:");
	newp=(struct link *)malloc(sizeof(struct link));    //申请新空间
	scanf("%d",&newp->data); 					//输入新数据					
	datanumber++;							//计数器加1
	//挂链操作
	newp->next=linktop.next;  					//新结点指向第一个结点
	linktop.next=newp;							//头结点指向新结点
	printf("进栈操作成功!\n");	
}
void pop()
{
	if(datanumber==0)
	printf("没有找到栈或者栈为空!\n");    		//判断栈的空间大小
	else
	{ 
	struct link *searchp;
	searchp=linktop.next;						//searchp指向第一个结点
	printf("从栈中弹出数据:%d\n",searchp->data);		
	linktop.next=searchp->next;   				//挂链
	free(searchp);   							//释放结点
	datanumber--;								//计数器减1
	} 
}

(2)运行步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

(3)运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、环队

//定义环队数组、队头队尾
int dataarray[10];//定义存储数组
int datanumber=0;//空间大小
int front=0;//队头 
int rear=0;//队尾

(1)数据进队、出队源码过程

void push()
{
	if(datanumber>=10)   				//判断队空间
	printf("环队已满!\n");
	else
	{ 
	printf("请输入要进队的新数据:");
	scanf("%d",&dataarray[rear]);   		//进队
	rear=(rear+1)%10; 					//rear前移一位
	datanumber++;					//计数器加1
	printf("进队操作成功!\n");
	} 
}
void pop()
{
	if(datanumber<=0)       			//判断队空间
	printf("环队为空!\n");
	else
	{
	printf("出队数据为:%d\n",dataarray[front]);   //出队
	front=(front+1)%10;					//front前移一位
	datanumber--; 						//计数器减1
	printf("出队操作成功!\n");
}
}

(2)步骤

在这里插入图片描述在这里插入图片描述

(3)运行结果

在这里插入图片描述

4、链队

struct link
{
	int data;
	struct link *next;
};
struct link front;			//队头(头结点)
struct link *newp;			//新结点 
struct link *rear;			//队尾

(1)数据进队、出队源码过程

void push()
{
	if(count==0)					//判断队是否为空
	{
	front.next=NULL;
	rear=&front;
	}
	printf("请输入要进队的新数据:");
	newp=(struct link *)malloc(sizeof(struct link));		//申请新空间
	count++;								//计数器加1
	scanf("%d",&newp->data);				//输入数据
	//挂链
rear->next=newp;						
	newp->next=NULL;
	rear=newp;
	printf("进队操作成功!\n"); 
}
void pop()
{
	if(count==0)						//判断队是否为空
	printf("目前链队为空!\n");
	else
	{
	struct link *searchp;
	searchp=front.next;					//searchp为第一个结点
	printf("出队数据为:%d\n",searchp->data);
	front.next=searchp->next;			//头结点指向第二个结点
	count--;							//计数器减1
	free(searchp);						//释放结点
	printf("出队操作成功!\n");
	}
}

(2)步骤

在这里插入图片描述
在这里插入图片描述

(3)运行结果

在这里插入图片描述

五、源码

1、链栈的功能演示

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
void showmenu();//菜单显示
void processmenu();//菜单控制

void push();//数据进栈
void pop();//数据出栈
void showdata();//显示栈中全部数据
void readdata();//读取栈顶数据
void destroy();//销毁一个栈
void isempty();//判断是否空栈

struct link { //定义链表结构体
	int data;
	struct link *next;
};
struct link linktop;//头结点,栈顶
struct link *newp;//新空间
struct link *lastp;//栈底
int datanumber=0;//记录栈空间
int count=0;
int main() {
	system("color f0");//背景白色
	while(1) {
		showmenu();
		processmenu();
		system("pause");
		system("cls");
	}
}
void showmenu() {
	puts("~~~~~~~~~~~~~~~~~~~~~~~~");
	puts("\t\t链栈的功能演示");
	puts("\t\t操作软件:dev c++");
	puts(" ~~~~~~~~~~~~~~~~~~~~~~~~");
	puts("~~~\t\t1、数据进栈\t\t~~~~");
	puts(" ~~~\t\t2、数据出栈\t\t ~~~~");
	puts("~~~\t\t3、显示栈中全部数据\t~~~~");
	puts(" ~~~\t\t4、读取栈顶数据\t\t ~~~~");
	puts("~~~\t\t5、销毁一个栈\t\t~~~~");
	puts(" ~~~\t\t6、判断是否空栈\t\t ~~~~");
	puts("~~~\t\t0、退出程序\t\t~~~~");
	puts("~~~~~~~~~~~~~~~~~~~~~~~~");
	puts("");
	printf("请输入您的选择:");
}
void processmenu() {
	int menuchoice;//菜单选择
	scanf("%d",&menuchoice);
	switch(menuchoice) {
		case 1:
			push();//数据进栈
			break;
		case 2:
			pop();//数据出栈
			break;
		case 3:
			showdata();//显示栈中全部数据
			break;
		case 4:
			readdata();//读取栈顶数据
			break;
		case 5:
			destroy();//销毁一个栈
			break;
		case 6:
			isempty();//判断是否空栈
			break;
		case 0:
			puts("\n ~~~~~~~~~~~~~~~~~~~~~~~~");
			puts("\t\t欢迎下次再用!");
			puts(" ~~~~~~~~~~~~~~~~~~~~~~~~\n");
			exit(0);

		default :
			printf("输入错误!请重新输入...\n");
	}
}
void push() {
	printf("输入准备进栈的数据:");
	newp=(struct link *)malloc(sizeof(struct link));
	scanf("%d",&newp->data);
	count++;
	datanumber++;
	newp->next=linktop.next;
	linktop.next=newp;
	printf("进栈操作成功!\n");
}
void showdata() {
	if(datanumber==0)
		printf("没有找到栈或者栈为空!\n");
	else {
		count=datanumber;
		struct link *searchp;
		searchp=&linktop;
		printf("目前栈的内容是:栈顶-> ");
		while(count>0) {
			printf("【%d】",searchp->next->data);
			searchp=searchp->next;
			count--;
		}
		printf("<-栈底\n");
	}
}
void pop() {
	if(datanumber==0)
		printf("没有找到栈或者栈为空!\n");
	else {
		struct link *searchp;
		searchp=linktop.next;
		printf("从栈中弹出数据:%d\n",searchp->data);
		linktop.next=searchp->next;
		free(searchp);
		datanumber--;
	}
}
void readdata() {
	if(datanumber<=0)
		printf("没有找到栈或者栈为空!\n");
	else
		printf("栈顶的数据为:%d\n",linktop.next->data);
}
void destroy() {
	struct link *searchp;
	char choice;
	if(datanumber==0)
		printf("没有找到栈或者栈为空!\n");
	else {
		printf("是否确认销毁(Y/y),任意为放弃:");
		getchar();
		scanf("%c",&choice);
		if(choice=='y'||choice=='Y') {
			printf("销毁成功!\n");
			datanumber=0;
			searchp=linktop.next;
			for(int i=0; i<datanumber; i++) {
				free(searchp);
				searchp=searchp->next;
			}
		} else {
			printf("销毁失败!\n");
		}
	}
}
void isempty() {
	if(datanumber==0)
		printf("栈为空!\n");
	else
		printf("栈为非空!\n");
}

2、顺序栈的功能演示

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#define len 30
void showmenu();//菜单显示
void processmenu();//菜单控制
void create();//创建一个栈
void destroy();//销毁一个栈
void push();//数据进栈
void pop();//数据出栈
void showdata();//显示栈中全部数据
void readdata();//读取栈顶数据
void isempty();//判断是否空栈
void isfull();//判断是否满栈
int dataarray[len];//定义存储数组
int datanumber=0;//栈的空间大小
int top=-1;//空栈
int main() {
	system("color f0");//背景白色
	while(1) {
		showmenu();
		processmenu();
		system("pause");
		system("cls");
	}
}
void showmenu() {
	puts("~~~~~~~~~~~~~~~~~~~~~~~~");
	puts("\t\t顺序栈的功能演示");
	puts("\t\t操作软件:dev c++");
	puts(" ~~~~~~~~~~~~~~~~~~~~~~~~");
	puts("~~~\t\t1、创建一个栈\t\t~~~~");
	puts(" ~~~\t\t2、销毁一个栈\t\t ~~~~");
	puts("~~~\t\t3、数据进栈\t\t~~~~");
	puts(" ~~~\t\t4、数据出栈\t\t ~~~~");
	puts("~~~\t\t5、显示栈中全部数据\t~~~~");
	puts(" ~~~\t\t6、读取栈顶数据\t\t ~~~~");
	puts(" ~~~\t\t7、判断是否空栈\t\t ~~~~");
	puts(" ~~~\t\t8、判断是否满栈\t\t ~~~~");
	puts("~~~\t\t0、退出程序\t\t~~~~");
	puts("~~~~~~~~~~~~~~~~~~~~~~~~");
	puts("");
	printf("请输入您的选择:");
}
void processmenu() {
	int menuchoice;//菜单选择
	scanf("%d",&menuchoice);
	switch(menuchoice) {
		case 1:
			create();//创建一个栈
			break;
		case 2:
			destroy();//销毁一个栈
			break;
		case 3:
			push();//数据进栈
			break;
		case 4:
			pop();//数据出栈
			break;
		case 5:
			showdata();//显示栈中全部数据
			break;
		case 6:
			readdata();//读取栈顶数据
			break;
		case 7:
			isempty();//判断是否空栈
			break;
		case 8:
			isfull();//判断是否满栈
			break;
		case 0:
			puts("\n ~~~~~~~~~~~~~~~~~~~~~~~~");
			puts("\t\t欢迎下次再用!");
			puts(" ~~~~~~~~~~~~~~~~~~~~~~~~\n");
			exit(0);

		default :
			printf("输入错误!请重新输入...\n");
	}
}
void create() {
	if(datanumber!=0)
		printf("栈已经存在,空间大小为:%d\n",datanumber);
	else {
		datanumber==0;
		top==-1;
		printf("请输入栈的空间大小(30以内):");
		scanf("%d",&datanumber);
		printf("创建栈成功!\n");
	}
}
void destroy() {
	char choice;
	if(datanumber<=0)
		printf("没有找到栈!\n");
	else {
		printf("是否确认销毁(Y/y),任意为放弃:");
		getchar();
		scanf("%c",&choice);
		if(choice=='y'||choice=='Y') {
			printf("销毁成功!\n");
			datanumber=0;
			top=-1;
		} else {
			printf("销毁失败!\n");
		}
	}
}

void push() {
	if(datanumber<=0||datanumber==top+1)
		printf("入栈失败!\n");
	else {
		printf("向栈压入数据为:");
		top++;
		scanf("%d",&dataarray[top]);
		printf("目前栈的内容是:栈底 ->");
		for(int i=0; i<=top; i++) {
			printf("【%d】 ",dataarray[i]);
		}
		printf("<-栈顶\n");
	}
}

void pop() {
	if(datanumber<=0||top==-1)
		printf("出栈失败!\n");
	else {
		printf("从栈中弹出数据:%d\n",dataarray[top]);
		top--;
		if(top==-1)
			printf("目前是空栈!\n");
		else {
			printf("目前栈的内容是:栈底-> ");
			for(int i=0; i<=top; i++) {
				printf("【%d】 ",dataarray[i]);
			}
			printf("<-栈顶\n");
		}
	}
}
void showdata() {
	if(datanumber<=0||top==-1)
		printf("没有建立栈或为空栈!\n");
	else {
		printf("目前栈的内容是:栈底 ->");
		for(int i=0; i<=top; i++) {
			printf("【%d】 ",dataarray[i]);
		}
		printf("<-栈顶\n");
	}
}
void readdata() {
	if(datanumber<=0||top==-1)
		printf("没有建立栈或为空栈!\n");
	else {
		printf("目前栈顶的内容是:%d \n",dataarray[top]);
		printf("目前栈的内容是:栈底-> ");
		for(int i=0; i<=top; i++) {
			printf("【%d】 ",dataarray[i]);
		}
		printf("<-栈顶\n");
	}
}
void isempty() {
	if(top==-1)
		printf("目前是空栈!\n");
	else
		printf("目前是非空栈!\n");
}
void isfull() {
	if(datanumber==0)
		printf("栈没有建立!\n");
	else if(top+1<datanumber)
		printf("目前非满栈,可继续入栈!\n");
	else
		printf("目前满栈,无法再入栈!\n");
}

3、链队的功能演示

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
void showmenu();//菜单显示
void processmenu();//菜单控制
void push();//数据进队 
void pop();//数据出队 
void showdata();//遍历数据
void readlong();//读取长度 
void readfront();//读取队头 
void isempty();//判断队空
int count=0;//计数 
struct link
{
	int data;
	struct link *next;
};
struct link front;//头
struct link *newp;//新 
struct link *rear;//尾 
int main()
{
	system("color f0");//背景白色
	while(1)
	{
		showmenu();
		processmenu();
		system("pause");
		system("cls");
	}
}
void showmenu()
{
	puts("~~~~~~~~~~~~~~~~~~~~~~~~");
	puts("\t\t链队的功能演示");
	puts("\t\t操作软件:dev c++");
	puts(" ~~~~~~~~~~~~~~~~~~~~~~~~");
	puts("~~~\t\t1、数据进队\t\t~~~~");
	puts(" ~~~\t\t2、数据出队\t\t ~~~~");
	puts("~~~\t\t3、遍历数据\t\t~~~~");
	puts(" ~~~\t\t4、读取队头\t\t ~~~~");
	puts("~~~\t\t5、判断队空\t\t~~~~");
	puts(" ~~~\t\t6、求链队长度\t\t ~~~~");
	puts("~~~\t\t0、退出程序\t\t~~~~");                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
    puts("~~~~~~~~~~~~~~~~~~~~~~~~");
	puts("");
	printf("请输入您的选择:");
}
void processmenu()
{
	int menuchoice;//菜单选择  
	scanf("%d",&menuchoice);
	switch(menuchoice)
	{
		case 1:
		 	push();//数据进队 
			break;
		case 2:
			pop();//数据出队 
			break;
		case 3:
			showdata();//遍历数据 
			break;
		case 4:
			readfront();//读取队头
			break;
		case 5:
			isempty();//判断队空 
			break;
		case 6:
			readlong();//读取长度
			break;
		case 0:
			puts("\n ~~~~~~~~~~~~~~~~~~~~~~~~");
			puts("\t\t欢迎下次再用!");
			puts(" ~~~~~~~~~~~~~~~~~~~~~~~~\n");
			exit(0);
			
		default :
		printf("输入错误!请重新输入...\n");
	}
}  
void push()
{
	if(count==0)
	{
	front.next=NULL;
	rear=&front;
	}
	printf("请输入要进队的新数据:");
	newp=(struct link *)malloc(sizeof(struct link));
	count++;
	scanf("%d",&newp->data);
	rear->next=newp;
	newp->next=NULL;
	rear=newp;
	printf("进队操作成功!\n"); 
}
void showdata()
{
	if(count==0)
	printf("目前链队为空!\n");
	else
	{
	struct link *searchp; 
	printf("链队中全部数据为:");
	searchp=front.next;
	printf("front->(");
	while(searchp!=NULL)
	{
		printf(" %d",searchp->data);
		searchp=searchp->next;
	}
	printf(")<-rear\n");
	printf("显示操作成功!\n");
	}
}
void pop()
{
	if(count==0)
	printf("目前链队为空!\n");
	else
	{
	struct link *searchp;
	searchp=front.next;
	printf("出队数据为:%d\n",searchp->data);
	front.next=searchp->next;
	count--;
	free(searchp);
	printf("出队操作成功!\n");
	}
}
void readfront()
{
	if(count==0)
	printf("目前链队为空!\n");
	else
	{
	printf("队头的数据为:%d\n",front.next->data);
	printf("读取操作成功!\n");
	}
}
void isempty()
{
	if(count==0)
	printf("目前链队为空!\n");
	else
	printf("目前链队为非空!\n");
}
void readlong()
{
	printf("目前链队的长度为:%d\n",count);
}

4、环队的功能演示

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
void showmenu();//菜单显示
void processmenu();//菜单控制
void push();//数据进队 
void pop();//数据出队 
void showdata();//遍历数据
void readlong();//读取长度 
void readfront();//读取队头 
void isempty();//判断队空  
int dataarray[10];//定义存储数组
int datanumber=0;//空间大小
int front=0;//队头 
int rear=0;//队尾
int main()
{
	system("color f0");//背景白色
	while(1)
	{
		showmenu();
		processmenu();
		system("pause");
		system("cls");
	}
}
void showmenu()
{
	puts("~~~~~~~~~~~~~~~~~~~~~~~~");
	puts("\t\t环队的功能演示");
	puts("\t\t操作软件:dev c++");
	puts(" ~~~~~~~~~~~~~~~~~~~~~~~~");
	puts("~~~\t\t1、数据进队\t\t~~~~");
	puts(" ~~~\t\t2、数据出队\t\t ~~~~");
	puts("~~~\t\t3、遍历数据\t\t~~~~");
	puts(" ~~~\t\t4、读取队头\t\t ~~~~");
	puts("~~~\t\t5、判断队空\t\t~~~~");
	puts(" ~~~\t\t6、求链队长度\t\t ~~~~");
	puts("~~~\t\t0、退出程序\t\t~~~~");                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
    puts("~~~~~~~~~~~~~~~~~~~~~~~~");
	puts("");
	printf("请输入您的选择:");
}
void processmenu()
{
	int menuchoice;//菜单选择  
	scanf("%d",&menuchoice);
	switch(menuchoice)
	{
		case 1:
		 	push();//数据进队 
			break;
		case 2:
			pop();//数据出队 
			break;
		case 3:
			showdata();//遍历数据 
			break;
		case 4:
			readfront();//读取队头
			break;
		case 5:
			isempty();//判断队空 
			break;
		case 6:
			readlong();//读取长度
			break;
		case 0:
			puts("\n ~~~~~~~~~~~~~~~~~~~~~~~~");
			puts("\t\t欢迎下次再用!");
			puts(" ~~~~~~~~~~~~~~~~~~~~~~~~\n");
			exit(0);
			
		default :
		printf("输入错误!请重新输入...\n");
	}
}
void push()
{
	if(datanumber>=10)
	printf("环队已满!\n");
	else
	{ 
	printf("请输入要进队的新数据:");
	scanf("%d",&dataarray[rear]);
	rear=(rear+1)%10;
	datanumber++;
	printf("进队操作成功!\n");
//	printf("目前front=%d,rear=%d,count=%d\n",front,rear,datanumber);
	} 
} 
void pop()
{
	if(datanumber==0)
	printf("环队为空!\n");
	else
	{ 
	printf("出队数据为:%d\n",dataarray[front]);
	front=(front+1)%10;
	datanumber--; 
	printf("出队操作成功!\n");
//	printf("目前front=%d,rear=%d,count=%d\n",front,rear,datanumber);
	}
} 
void showdata()
{
	printf("环队中全部数据为:front->(");
	for(int i=front;i<datanumber+front;i++)
	{
		printf(" %d",dataarray[i%10]);
	}
	printf(")<-rear\n");
	printf("遍历操作成功!\n");
} 
void readfront()
{
	printf("队头的数据为:%d\n",dataarray[front]);
	printf("读取操作成功!\n");
}
void readlong()
{
	printf("环队目前的长度为:%d\n",datanumber);
} 
void isempty()
{
	if(datanumber==0)
	printf("目前环队为空!\n");
	else
	printf("目前环队非空!\n");	
}  

猜你喜欢

转载自blog.csdn.net/qq_40833790/article/details/89483773