实验二 栈和队列基本操作的实现

加粗样式实验二 栈和队列基本操作的实现

实验目的

1.掌握栈、队列的思想及其存储实现
2.掌握栈、队列基本操作的实现

实验内容

1.编写函数,采用链式存储实现栈的初始化、入栈、出栈操作。
2.编写函数,采用顺序存储实现栈的初始化、入栈、出栈操作。
3.编写函数,采用链式存储实现队列的初始化、入队、出队操作。
4.编写函数,采用顺序存储实现队列的初始化、入队、出队操作。
5.编写一个主函数,在主函数中设计一个简单的菜单,分别调用上述函数。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
#define Status int
#define SElemType int
#define MaxSize 100
#define QElemType int

//菜单
void menu()
{
   printf("********1.入栈      2.出栈*********\n");
   printf("********3.退出*********\n");
}

//**************************************顺序栈基本操作函数************************************//
//顺序栈数据结构 
typedef struct Stack
{
	SElemType *base;//栈底指针 
	SElemType *top;//栈顶指针 
	int stacksize;//栈可用的最大容量
}SqStack;
//初始化函数
Status InitStack(SqStack &s)
{
	s.base=new SElemType[MaxSize];//动态分配最大容量
	if(!s.base)
	{
		printf("分配失败\n");
		return 0;
	}
	s.top=s.base;//
	s.stacksize=MaxSize;
	return 1;
}
//入栈
Status Push(SqStack &s,SElemType e)
{
	if(s.top-s.base==s.stacksize) return 0;//栈满
	*(s.top++)=e;//先压栈再++ 
	return 1;	
}
//出栈 用e返回值
Status Pop(SqStack &s,SElemType &e)
{
	if(s.top==s.base) return 0;//栈空
	e=*--s.top;//先减减 指向栈顶元素,再给e
	return 1;	
}

//********************************功能实现函数**************************************//
//入栈功能函数 调用Push函数
void PushToStack(SqStack &s)
{
	int n;SElemType e;int flag;
	printf("请输入入栈元素个数(>=1):\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	 printf("请输入第%d个元素的值:",i+1);
	 scanf("%d",&e);
	 flag=Push(s,e);
	 if(flag)printf("%d已入栈\n",e);
	 else {printf("栈已满!!!\n");break;}
	}
}
//出栈功能函数 调用Pop函数
void PopFromStack(SqStack &s)
{
	int n;SElemType e;int flag;
	printf("请输入出栈元素个数(>=1):\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	 flag=Pop(s,e);
	 if(flag)printf("%d已出栈\n",e);
	 else {printf("栈已空!!!\n");break;}
	}
}



//**************************链栈基本操作函数***************************//
//链栈结点数据结构
typedef struct StackNode
{
	SElemType data;//数据域
	struct StackNode *next;//指针域
}StackNode,*LinkStack;
//初始化函数
Status InitStack(LinkStack &S)
{
 S = NULL;//生成空栈 以单链表表头为栈顶 链栈没有像链表似的头结点
 return 1;
}
//入栈函数 将e压入栈
Status Push(LinkStack &S,SElemType e)
{
	StackNode *p;
	p=new StackNode;
	p->data=e;      //赋值
	p->next=S;      //压入栈顶
	S=p;
	return 1;
}
//出栈函数  栈顶出栈用e返回 注意释放空间
bool Pop(LinkStack &S,SElemType &e)
{
	LinkStack p;
	if(S==NULL)return false;//栈空
	e=S->data;
	p=S;
	S=S->next;
	free(p);
	return true;
}
//**************************功能实现函数***************************//
//入栈功能函数 调用Push函数 
void PushToStack(LinkStack &S)
{
	int n;SElemType e;int flag;
	printf("请输入入栈元素个数(>=1):\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	 printf("请输入第%d个元素的值:",i+1);
	 scanf("%d",&e);
	 flag=Push(S,e);
	 if(flag)printf("%d已入栈\n",e);
	}
}
//出栈功能函数 调用Pop函数
void PopFromStack(LinkStack &S)
{
	int n;SElemType e;int flag;
	printf("请输入出栈元素个数(>=1):\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	 flag=Pop(S,e);
	 if(flag)printf("%d已出栈\n",e);
	 else {printf("栈已空!!!\n");break;}
	}
}



//***************************循环队列基本操作函数**************************//
//循环队列数据结构
typedef struct
{
	QElemType *base;//数据域
	int front,rear;          //队头队尾指针
}SqQueue;
//初始化函数
Status InitQueue(SqQueue &Q)
{
	Q.front=Q.rear=0;
	return 1;
}
//判断队空函数
bool QueueEmpty(SqQueue Q)
{
	if(Q.front!=Q.rear)return false;
	else return true;
}
//入队函数
bool EnQueue(SqQueue &Q,QElemType e)
{
	if((Q.rear+1)%MaxSize==Q.front)return false; //队列满 牺牲一个以判断
	Q.base[Q.rear]=e;
	Q.rear=(Q.rear+1)%MaxSize;//指针加1 取模
	return true;
}
//出队函数
bool DeQueue(SqQueue &Q,QElemType &e)
{
	if(Q.front==Q.rear) return false;
	e=Q.base[Q.front];
	Q.front=(Q.front+1)%MaxSize;
	return 1;
}

//**************************功能实现函数****************************//
//入队功能函数 调用EnQueue函数
void EnterToQueue(SqQueue &Q)
{
	int n;QElemType e;int flag;
	printf("请输入入队元素个数(>=1):\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	 printf("请输入第%d个元素的值:",i+1);
	 scanf("%d",&e);
	 flag=EnQueue(Q,e);
	 if(flag)printf("%d已入队\n",e);
	 else {printf("队已满!!!\n");break;}
	}
}
//出队函数 调用DeQueue函数
void DeleteFromQueue(SqQueue &Q)
{
	int n;QElemType e;int flag;
	printf("请输入出队元素个数(>=1):\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	 flag=DeQueue(Q,e);
	 if(flag)printf("%d已出队\n",e);
	 else {printf("队已空!!!\n");break;}
	}
}




//**************************链队基本操作函数***************************//
//链队结点数据结构
typedef struct QNode
{
	QElemType data;//数据域
	struct QNode *next;//指针域
	
}QNode,*QueuePtr;
typedef struct
{
	struct QNode *front,*rear;//rear指针指向队尾 用于入队 front指针指向队头 用于出队
}LinkQueue;

//初始化函数
Status InitQueue(LinkQueue &Q)
{
	Q.front=Q.rear=new QNode;//生成新节点作为头结点,队头队尾指针均指向它
	Q.front->next=NULL;
	return 1;
}
//入队函数 
Status EnQueue(LinkQueue &Q,QElemType e)
{
	QNode *p;
	p=new QNode;//生成新节点
	p->data=e;    //赋值
	p->next=NULL;
	Q.rear->next=p;//加入队尾
	Q.rear=p;      //尾指针后移
	return 1;
}
//出队函数  队头出队用e返回 注意释放空间
bool DeQueue(LinkQueue &Q,QElemType &e)
{
	QueuePtr p;
	if(Q.front==Q.rear)return false;//队空
	e=Q.front->next->data;           //e返回值 头结点没数据的,一定要注意头结点
	p=Q.front->next;                //保留,释放空间
	Q.front->next=p->next;          //出队
	if(Q.rear==p)Q.rear=Q.front;    //最后一个元素出队,rear指向头结点
	free(p);
	return true;
}

//**************************功能实现函数***************************//
//入队功能函数 调用EnQueue函数 
void EnterToQueue(LinkQueue &Q)
{
	int n;QElemType e;int flag;
	printf("请输入入队元素个数(>=1):\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	 printf("请输入第%d个元素的值:",i+1);
	 scanf("%d",&e);
	 flag=EnQueue(Q,e);
	 if(flag)printf("%d已入队\n",e);
	}
}
//出队功能函数 调用DeQueue函数
void DeleteFromQueue(LinkQueue &Q)
{
	int n;QElemType e;int flag;
	printf("请输入出队元素个数(>=1):\n");
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
	 flag=DeQueue(Q,e);
	 if(flag)printf("%d已出队\n",e);
	 else {printf("队已空!!!\n");break;}
	}
}

int main()
{   int choice; 
	while(1){
		printf("\t\t1.实现顺序栈的基本操作\n\n");
		printf("\t\t2.实现链栈的基本操作\n\n");
		printf("\t\t3.实现循环队列的基本操作\n\n");
		printf("\t\t4.实现链队的基本操作\n\n");
		printf("\t\t5.退出\n\n");
		printf("\n\n\n\t请输入菜单序号:");
		scanf("%d",&choice);
		if(choice==5)break;
		switch(choice)
		{
			case 1: 
				SqStack s;int num;
                InitStack(s);
                while(1)
                {
                  menu();
                  printf("请输入菜单序号(顺序栈):\n");
                  scanf("%d",&num);
                  if(num==3) break;
                  switch(num)
                   {
                     case 1:PushToStack(s);break;
                     case 2:PopFromStack(s);break;
 
                      default:printf("输入错误!!!\n");
                    }
                }
 
				break;
			case 2:
			     LinkStack S;int choice;
                 InitStack(S);
                 while(1)
                 {
                  menu();
                  printf("请输入菜单序号(链栈):\n");
                  scanf("%d",&choice);
                  if(choice==3) break;
                  switch(choice)
                  {
                   case 1:PushToStack(S);break;
                   case 2:PopFromStack(S);break;

                   default:printf("输入错误!!!\n");
                  }     
                }

			break;
			case 3:
			SqQueue Q;int a;
	             InitQueue(Q);
	             while(1)
                {
	              menu();
	              printf("请输入菜单序号(循环队列):\n");
                 scanf("%d",&a);
	             if(a==3) break;
	             switch(a)
             	 {
             	case 1:EnterToQueue(Q);break;
	            case 2:DeleteFromQueue(Q);break;
	
	             default:printf("输入错误!!!\n");
	             }
	            }
				
			break;
			case 4:
			LinkQueue 	Z;int b;
                  InitQueue(Z);
                 while(1)
                {
                 menu();
                 printf("请输入菜单序号(链队):\n");
                 scanf("%d",&b);
                 if(b==3) break;
                 switch(b)
                 {
                    case 1:EnterToQueue(Z);break;
                    case 2:DeleteFromQueue(Z);break;
                  default:printf("输入错误!!!\n");
                 }
                }
				
			break;	
			
		}
	}
		return 0;
 } 
 

版权声明:本文为cytcytcytcytcyt原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。