数据结构--耿国华版(课设3)----栈与队列---------链栈、顺序栈、链队、顺序队

要求:

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

代码:

#include<stdio.h>
#include<stdlib.h>    
#include <malloc.h>
#include<windows.h>
#pragma warning(disable:4996)
#define MAXSIZE 256
typedef int datatype; 
typedef struct node                //定义链栈
{
	datatype data;
	struct node *next;
}StackNode, QNode, *LinkStack;
typedef struct                    //定义顺序栈
{
	datatype data[MAXSIZE];
	int front, rear;
	int num;
	int top;
}SeqStack, C_SeQueue;
typedef struct                   //定义链队
{
	QNode *front, *rear;
}LQueue;
LinkStack Init_LinkStack()      //链栈初始化函数
{
	StackNode *L;
	L = (StackNode*)malloc(sizeof(StackNode));
	L->data = -32767;
	L->next = NULL;
	return L;
}
LinkStack Push_LinkStack(LinkStack top, datatype x)  //链栈入栈函数
{
	StackNode *s;
	s = (StackNode*)malloc(sizeof(StackNode));
	s->data = x;
	s->next = top->next;
	top->next = s;
	return top;
}
LinkStack Pop_LinkStack(LinkStack top, datatype *s)   //链栈出栈函数
{
	StackNode *p;
	int j = 0;
	p = top->next;
	if (p != NULL)
	{
		*s = p->data;
		top->next = p->next;
		free(p);
	}
	return top;
}
SeqStack * init_SeqStack()                           //顺序栈初始化函数
{
	SeqStack *S;
	S = (SeqStack*)malloc(sizeof(SeqStack));
	S->top = -1;
	return S;
}
int Push_SeqStack(SeqStack *S, datatype x)          //顺序栈入栈函数
{
	if (S->top == MAXSIZE - 1)
	{
		return(0);
	}
	else
	{
		S->top++;
		S->data[S->top] = x;
		return(1);
	}
}
int Pop_SeqStack(SeqStack *S, datatype *p)            //顺序栈出栈函数
{
	{
		*p = S->data[S->top];
		S->top--;
		return 1;
	}
}
LQueue *Init_LQueue()                             //链队初始化函数
{
	LQueue *q;
	QNode *p;
	q = (LQueue*)malloc(sizeof(LQueue));
	p = (QNode*)malloc(sizeof(QNode));
	p->next = NULL;
	q->front = q->rear = p;
	return q;
}
void In_LQueue(LQueue *q, datatype x)              //链队入队函数
{
	QNode *p;
	p = (QNode*)malloc(sizeof(QNode));
	p->data = x;
	p->next = NULL;
	q->rear->next = p;
	q->rear = p;
}
int Out_LQueue(LQueue *q, datatype *s)              //链队出队函数
{
	QNode *p;
	p = q->front->next;
	q->front->next = p->next;
	*s = p->data;
	free(p);
	if (q->front->next == NULL)
		q->rear = q->front;
	return 1;
}
C_SeQueue *init_SeQueue()                       //顺序队初始化函数
{
	C_SeQueue *q;
	q = (C_SeQueue*)malloc(sizeof(C_SeQueue));
	q->front = q->rear = MAXSIZE - 1;
	q->num = 0;
	return q;
}
int In_SeQueue(C_SeQueue *q, datatype x)            //顺序队入队函数
{
	if (q->num == MAXSIZE)
	{
		return(-1);
	}
	else
	{
		q->rear = (q->rear + 1) % MAXSIZE;
		q->data[q->rear] = x;
		q->num++;
		return(1);
	}
}
int Out_SeQueue(C_SeQueue *q, datatype *p)                 //顺序队出队
{
	if (q->num == 0)
	{
		return -1;
	}
	else
	{
		q->front = (q->front + 1) % MAXSIZE;
		*p = q->data[q->front];
		q->num--;
		return 1;
	}
}
C_SeQueue *init_SeQueue();                            //顺序队初始化

int In_SeQueue(C_SeQueue *q, datatype x);             //顺序队入队
int Out_SeQueue(C_SeQueue *q, datatype *p);          //顺序队出队
int main() {
	int n, m, t = 1;
	while (t)
	{
		printf("\n");
		printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
		printf("###########     1.链栈     #########\n");
		printf("###########     2.顺序栈   #########\n");
		printf("###########     3.链队     #########\n");
		printf("###########     4.顺序队   #########\n");
		printf("###########     0.结束     #########\n");
		printf("###########     请选择:    #########\n");
		printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
		printf("Please Enter Your Select:>");
		scanf("%d", &n);
		switch (n)
		{
		case 1://选择链栈相关操作
		{
			LinkStack  L = NULL;
			while (t)
			{
				printf("\n");
				printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
				printf("###########     1.初始化   #########\n");
				printf("###########     2.入栈     #########\n");
				printf("###########     3.出栈     #########\n");
				printf("###########  4.返回上一层  #########\n");
				printf("###########     请选择:    #########\n");
				printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
				printf("Please Enter Your Select:>");
				scanf("%d", &m);
				if (m == 4)
					break;
				else
				{
					switch (m)
					{
					case 1: L = Init_LinkStack(); break;//链栈初始化
					case 2: {LinkStack p; //链栈入栈
						datatype x;
						printf("请输入要入栈的元素 x:\n");
						scanf("%d", &x);
						L = Push_LinkStack(L, x);
						p = L->next;
						while (p)
						{
							printf("%d", p->data);
							p = p->next;
						}
						printf("\n");
						break;
					}
					case 3: {
						datatype x, *s;
						LinkStack p;
						s = &x;
						L = Pop_LinkStack(L, s);
						p = L->next;
						while (p)
						{
							printf("%d", p->data);
							p = p->next;
						}

						printf("出栈1数为:%d", x);
						printf("\n");
						break;
					}
					case 4:break;
					}
				}
			}
		}break;
		case 2: {//选择顺序栈相关操作
			SeqStack *S=0;
			while (t)
			{
				printf("\n");
				printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
				printf("~~~~~~~~~~    1.初始化    ~~~~~~~~~~\n");
				printf("~~~~~~~~~~    2.入栈1     ~~~~~~~~~~\n");
				printf("~~~~~~~~~~    3.出栈1     ~~~~~~~~~~\n");
				printf("~~~~~~~~~~  4.返回上一层  ~~~~~~~~~~\n");
				printf("~~~~~~~~~~ 请输入你的选择 ~~~~~~~~~~\n");
				printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
				printf("Please Enter Your Select:>");
				scanf("%d", &m);
				if (m == 4)
					break;
				else
				{
					switch (m)
					{
					case 1:
						S = init_SeqStack(); break;//顺序栈初始化
					case 2: {//顺序栈入栈
						int i, success;
						datatype x;
						printf("请输入x:\n");
						scanf("%d", &x);
						success = Push_SeqStack(S, x);
						if (success == 1)
						{
							for (i = 0; i <= S->top; i++)
							{
								printf("%d ", S->data[i]);
							}
						}
						else
							printf("stack full!\n");
					}printf("\n");
							break;
					case 3: {//顺序栈出栈
						int i, success;
						datatype x, *p;
						p = &x;
						success = Pop_SeqStack(S, p);
						if (success == 1)
						{
							for (i = 0; i <= S->top; i++)
							{
								printf("%d ", S->data[i]);
							}
							printf("出栈1数:%d", x);
						}
						else
							printf("stack empty!\n");
						printf("\n");
					}break;
					}
				}
			}
		}
		case 3: {//链队相关操作
			LQueue *Q = NULL;
			while (t)
			{
				printf("\n");
				printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
				printf("############   1.初始化    #########\n");
				printf("############   2.入队      #########\n");
				printf("############   3.出队      #########\n");
				printf("############  4.返回上一层 #########\n");
				printf("############    请选择:    #########\n");
				printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
				printf("Please Enter Your Select:>");
				scanf("%d", &m);
				if (m == 4)
					break;
				else
				{
					switch (m)
					{
					case 1:Q = Init_LQueue();//链队初始化
						break;
					case 2: {//链队入队
						datatype x;
						QNode *p;
						printf("请输入x:\n");
						scanf("%d", &x);
						In_LQueue(Q, x);
						p = Q->front->next;
						while (p != NULL)
						{
							printf("%d", p->data);
							p = p->next;
						}
					}printf("\n");
							break;
					case 3: {//链队出队
						int flag;
						datatype x, *s;
						QNode *p;
						s = &x;
						flag = Out_LQueue(Q, s);
						p = Q->front->next;
						if (flag == 1)
						{
							while (p != NULL)
							{
								printf("%d ", p->data);
								p = p->next;
							}
							printf("出队为:%d\n", x);
						}
						else
							printf("queue empty!\n");
					}break;
					}
				}
			}
		}
		case 4: {//顺序队的相关操作
			C_SeQueue *Q=0;
			while (t)
			{
				printf("\n");
				printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
				printf("############   1.初始化    #########\n");
				printf("############   2.入队      #########\n");
				printf("############   3.出队      #########\n");
				printf("############  4.返回上一层 #########\n");
				printf("############    请选择:    #########\n");
				printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
				printf("Please Enter Your Select:>");
				scanf("%d", &m);
				if (m == 4)
					break;
				else
				{
					switch (m)
					{
					case 1:
						Q = init_SeQueue(); 
						break;                  //顺序队初始化
					case 2: {                                      //顺序队入队
						int i, flag, number;
						datatype x;
						printf("请输入x:\n");
						scanf("%d", &x);
						flag = In_SeQueue(Q, x);
						number = Q->num;
						if (flag == 1)
						{
							for (i = (Q->front + 1) % MAXSIZE; number > 0; number--, i = (i + 1) % MAXSIZE)
							{
								printf("%d", Q->data[i]);
							}
						}
						else
							printf("queue full!\n");
					}
							break;
					case 3: {
						int i, flag, number;
						datatype x, *p;
						p = &x;
						flag = Out_SeQueue(Q, p);
						number = Q->num;
						if (flag == 1)
						{
							for (i = (Q->front + 1) % MAXSIZE; number > 0; number--, i = (i + 1) % MAXSIZE)
							{
								printf("%d", Q->data[i]);
							}
							printf("出队为:%d\n", x);
						}
						else
							printf("queue empty!\n");
					}break;

					}
				}
			}}
		case 0:return 0;
		}
	}
	system("pause");
	return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值