栈和队列的实现

  1. 栈的顺序实现及操作

1.建立顺序栈;

2.顺序栈的push操作;

从栈顶开始打印栈;

3.获取顺序栈长度;

4.顺序栈的pop操作;

5.清空顺序栈;

  1. 栈的链式表示及操作

1.建立链式栈;

2.链式栈的push操作;

从栈顶开始打印栈;

3.获取链式栈长度;

4.链式栈的pop操作;

5.清空链式栈;

  1. 队列的链式表示和操作

1.初始化队列

2.判断队列是否为空

3.入队操作

4.出队操作

5.清空队列

//栈的顺序实现及操作
#include<iostream>
#include<malloc.h>
#include<conio.h>
#include<windows.h>
#define Stack_Size 50
using namespace std;
typedef struct
{
	int elem[Stack_Size];
	int top;//用来存放栈顶元素的下标 
 }SeqStack;
void InitStack(SeqStack *&S)
{
	/*构造一个空栈S*/
	S=(SeqStack*)malloc(sizeof(SeqStack));
	S->top=-1;
}
int Push(SeqStack *S,int x)
{
	if(S->top==(Stack_Size-1))
	{
		return(FALSE);  /*栈已满*/
	}  
	S->top++;
	S->elem[S->top]=x;

	return(TRUE);
}
int Print(SeqStack *S)
{  
	/* 将栈S的栈顶元素弹出,放到x所指的存储空间中 */
	if(S->top==-1)  /*栈为空*/
		return(FALSE);
	else
	{
		for(int x=S->top;x>=0;x--)
		{
			cout<<S->elem[x]<<" ";
		}
		cout<<endl;
  		return(TRUE);
	}
}
int Length(SeqStack *S)
{
	return S->top+1;
}
int Pop(SeqStack *S)
{  
	/* 将栈S的栈顶元素弹出,放到x所指的存储空间中 */
	if(S->top==-1)  /*栈为空*/
		return(FALSE);
	else
	{
		S->top--;    /* 修改栈顶指针 */
  		return(TRUE);
	}
}
void Clear(SeqStack *S)
{
	S->top=-1;
	free(S->elem);
}
int main()
{
	int a;
	SeqStack *S;
	do
	{
		cout<<"1.建立顺序栈;"<<endl;
		cout<<"2.顺序栈的push操作;"<<endl;
		cout<<"3.从栈顶开始打印栈;"<<endl;
		cout<<"4.获取顺序栈长度;"<<endl;
		cout<<"5.顺序栈的pop操作;"<<endl;
		cout<<"6.清空顺序栈;"<<endl;
		cout<<"7.结束程序"<<endl;
		cin>>a;
		if(a==1)
		{
			InitStack(S);
			system("CLS");
		}
		else if(a==2)
		{
			int n;
			cout<<"请输入push的次数"<<endl;
			cin>>n;
			int x[n];
			cout<<"请依次输入push的数值"<<endl;
			for(int i=0;i<n;i++)
			{
				cin>>x[i];
			}
			for(int i=1;i<=n;i++)
			{
				Push(S,x[i-1]);
			}
			system("CLS");
		}
		else if(a==3)
		{
			Print(S);
		}
		else if(a==4)
		{
			cout<<Length(S)<<endl;
		}
		else if(a==5)
		{
			int n;
			cout<<"请输入pop的次数"<<endl;
			cin>>n;
			for(int i=1;i<=n;i++)
			{
			Pop(S);
			}
			system("CLS"); 
		}
		else if(a==6)
		{
			Clear(S);
			system("CLS"); 
		}
	}
	while(a!=7);
	cout<<"班级:计21-2班   姓名:沈润晨   学号:214010219"<<endl;
	return 0;
}
//栈的链式表示及操作
#include<iostream>
#include<malloc.h>
#include<conio.h>
#include<windows.h>
using namespace std;
typedef struct LinkStackNode
{
	int data;
	struct LinkStackNode* next;
}LinkStackNode;
typedef struct{
    LinkStackNode *top;//指针域 
    LinkStackNode *head;
}LinkStack;
void InitStack(LinkStack &S)
{
    S.head=(LinkStackNode *)malloc(sizeof(LinkStackNode)*100);
    S.head->next = NULL;
    S.top = S.head;//初试栈为空
}
int Push(LinkStack S,int x)  
{
	/* 将数据元素x压入栈top中 */
	LinkStackNode *temp;
	temp=(LinkStackNode *)malloc(sizeof(LinkStackNode));
 	if(temp==NULL)  
		return(FALSE);   /* 申请空间失败 */
	temp->data=x;
	temp->next=S.top->next;
	S.top->next=temp;   /* 修改当前栈顶指针 */ 
	return(TRUE);
}
int Print(LinkStack S)
{  
	LinkStackNode *temp;
	temp=S.top->next;
	if(temp==NULL)  /*栈为空*/
		return(FALSE);
	while(temp!=NULL)
	{
		cout<<temp->data<<" ";
		temp=temp->next;
	}
	cout<<endl;
	return(TRUE);
}
int Length(LinkStack S)
{
	int n=0;
	LinkStackNode *temp;
	temp=S.top->next;
	while(temp!=NULL)
	{
		n++;
		temp=temp->next;
	}
	return n;
}
int Pop(LinkStack S)
{  
	/* 将栈top的栈顶元素弹出 */
	LinkStackNode *temp;
	temp=S.top->next;
	if(temp==NULL)  /*栈为空*/
		return(FALSE);
	S.top->next=temp->next;
	free(temp);   /* 释放存储空间 */
	return(TRUE);
}
void Clear(LinkStack S)
{
	S.top->next=NULL;
	free(S.head);
}
int main()
{
	int a;
	LinkStack S;
	do
	{
		cout<<"1.建立链式栈;"<<endl;
		cout<<"2.链式栈的push操作;"<<endl;
		cout<<"3.从栈顶开始打印栈;"<<endl;
		cout<<"4.获取链式栈长度;"<<endl;
		cout<<"5.链式栈的pop操作;"<<endl;
		cout<<"6.清空链式栈;"<<endl;
		cout<<"7.结束程序"<<endl;
		cin>>a;
		if(a==1)
		{
			InitStack(S);
			system("CLS");
		}
		else if(a==2)
		{
			int n;
			cout<<"请输入push的次数"<<endl;
			cin>>n;
			int x[n];
			cout<<"请依次输入push的数值"<<endl;
			for(int i=0;i<n;i++)
			{
				cin>>x[i];
			}
			for(int i=1;i<=n;i++)
			{
				Push(S,x[i-1]);
			}
			system("CLS");
		}
		else if(a==3)
		{
			Print(S);
		}
		else if(a==4)
		{
			cout<<Length(S)<<endl;
		}
		else if(a==5)
		{
			int n;
			cout<<"请输入pop的次数"<<endl;
			cin>>n;
			for(int i=1;i<=n;i++)
			{
			Pop(S);
			}
			system("CLS"); 
		}
		else if(a==6)
		{
			Clear(S);
			system("CLS"); 
		}
	}
	while(a!=7);
	cout<<"班级:计21-2班   姓名:沈润晨   学号:214010219"<<endl;
	return 0;
}
//队列的链式表示和操作
#include<iostream>
#include<malloc.h>
#include<conio.h>
#include<windows.h>
using namespace std;
typedef struct Node
{
	int data;
	struct Node* next;
}LinkQueueNode;
typedef struct
{
	LinkQueueNode* front;
	LinkQueueNode* rear;
}LinkQueue;
int InitQueue(LinkQueue *Q)
{ 
	/* 将Q初始化为一个空的链队列 */
	Q->front=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
	if(Q->front!=NULL)
	{
		Q->rear=Q->front;
		Q->front->next=NULL;
 		return(TRUE);
	}
	else  	
	return(FALSE);    /* 溢出!*/
}
int JudgeQueue(LinkQueue *Q)
{
	if(Q->front==Q->rear)
	{
		cout<<"栈为空"<<endl;
		return 0;
	}
	else
	{
		cout<<"栈不为空"<<endl; 
	}
}
int EnterQueue(LinkQueue *Q,int x)
{  
	/* 将数据元素x插入到队列Q中 */
	LinkQueueNode *NewNode;
	NewNode=(LinkQueueNode *)malloc(sizeof(LinkQueueNode));
	if(NewNode!=NULL)
	{
		NewNode->data=x;
		NewNode->next=NULL;
		Q->rear->next=NewNode;
	  	Q->rear=NewNode;
		return(TRUE);
	}
	else  
	return(FALSE);    /* 溢出!*/
}
int DeleteQueue(LinkQueue *Q)
{  
	/* 将队列Q的队头元素出队 */
	LinkQueueNode *p;
	if(Q->front==Q->rear)
		return(FALSE);
	p=Q->front->next;
	Q->front->next=p->next;  /* 队头元素p出队 */
	if(Q->rear==p)  /* 如果队中只有一个元素p,则p出队后成为空队 */
	Q->rear=Q->front;  
	free(p);   /* 释放存储空间 */
	return(TRUE);	
}
void ClearQueue(LinkQueue *Q)
{
	Q->front==Q->rear;
	free(Q->front);
}
int main()
{
	int a;
	LinkQueue S;
	do
	{
		cout<<"1.初始化队列"<<endl;
		cout<<"2.链判断队列是否为空 "<<endl;
		cout<<"3.入队操作"<<endl;
		cout<<"4.出队操作"<<endl;
		cout<<"5.清空队列"<<endl;
		cout<<"6.结束程序"<<endl;
		cin>>a;
		if(a==1)
		{
			InitQueue(&S);
			system("CLS");
		}
		else if(a==2)
		{
			JudgeQueue(&S);
		}		
		else if(a==3)
		{
			int n;
			cout<<"请输入入队的次数"<<endl;
			cin>>n;
			int x[n];
			cout<<"请依次输入入队的数值"<<endl;
			for(int i=0;i<n;i++)
			{
				cin>>x[i];
			}
			for(int i=1;i<=n;i++)
			{
				EnterQueue(&S,x[i-1]);
			}
			system("CLS");
		}
		else if(a==4)
		{
			int n;
			cout<<"请输入出队的次数"<<endl;
			cin>>n;
			for(int i=1;i<=n;i++)
			{
			DeleteQueue(&S);
			}
			system("CLS"); 
		}
		else if(a==5)
		{
			ClearQueue(&S);
			system("CLS"); 
		}
	}
	while(a!=6);
	cout<<"班级:计21-2班   姓名:沈润晨   学号:214010219"<<endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值