一、实验题目
栈与队列基本操作的编程实现
二、实验要求
栈和队列基本操作的编程实现,掌握栈和队列的建立、进栈、出栈、进队、出队等基本操作的编程实现,也可以进一步编程实现实用的功能等操作,具体编程存储结构要求是顺序存储结构和链表存储结构,可以依次完成主要功能来体现功能的正确性,用菜单进行管理完成大部分功能,要求可以重复运行。白底黑字,标题栏为自己的个人信息。
三、运行效果图
四、程序基本功能
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");
}
}