数据结构实验二

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

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define Stack_Size 10             //宏  栈的大小
#define FALSE 0
#define TRUE 1

typedef int StackElementType;      //宏定义栈
typedef int QueueElementType;      //宏定义队列

typedef struct node      //定义一个结构体结点
{
	StackElementType data;  //定义栈的数据域
	struct node* next;      //定义栈的指针域
}LinkStackNode, *LinkStack;

typedef struct
{
	StackElementType elem[Stack_Size];  //定义栈的大小
	int top;                  //定义一个栈顶
}SeqStack;

typedef struct Node            //定义一个结构体结点
{
	QueueElementType data;     //定义队列的数据域
	struct Node* next;         //定义队列的指针域
}LinkQueueNode;

typedef struct
{
	LinkQueueNode *front;     //定义一个队首
	LinkQueueNode *rear;       //定义一个队尾
}LinkQueue;

void InitLink(LinkStack top)//初始化链栈
{
	top->data = 0;
	top->next = NULL;
}

void PushLink(LinkStack top, StackElementType x)  //链栈入栈
{
	LinkStackNode* temp;
	temp = (LinkStackNode*)malloc(sizeof(LinkStackNode));
	temp->data = x;
	temp->next = top->next;
	top->next = temp;
}

void PopLink(LinkStack top, StackElementType *x)   //链栈出栈
{
	LinkStackNode* temp;
	temp = top->next;
	top->next = temp->next;
	*x = temp->data;
	free(temp);
}
void DisplayLink(LinkStack top)        //打印链栈
{
	LinkStackNode *temp;
	temp = top;
	while (temp->next != NULL)
	{
		temp = temp->next;
		printf("%d", temp->data);
		printf("->");
	}
	printf("NULL\n");
}

int InitSeq(SeqStack* S)          //初始化顺序栈
{
	S->top = -1;
	return TRUE;
}

void PushSeq(SeqStack* S, StackElementType x)     //顺序栈入栈
{
	if (S->top == Stack_Size - 1)
	{
		printf("栈已满!\n");
		return;
	}
	S->top++;
	S->elem[S->top] = x;

}

int PopSeq(SeqStack* S, StackElementType* x)         //顺序栈出栈
{
	if (S->top == -1)
	{
		return(FALSE);
	}
	else
	{
		*x = S->elem[S->top];
		S->top--;
		return(TRUE);
	}
}
int GetTop(SeqStack* S, StackElementType* x)   //输出顺序栈的栈顶元素
{
	if (S->top == -1)
	{
		return(FALSE);
	}
	else
	{
		*x = S->elem[S->top];
		printf("出栈后栈顶元数为 %d\n", *x);
		return(TRUE);
	}
}

int InitQueue(LinkQueue *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	EnterQueue(LinkQueue *Q, QueueElementType x)    //链队列入队
{
	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, QueueElementType *x)      //链队列出队
{
	LinkQueueNode *p;
	if (Q->front == Q->rear)
	{
		return (FALSE);
	}
	p = Q->front->next;
	Q->front->next = p->next;
	if (Q->rear == p)
		Q->rear = Q->front;
	*x = p->data;
	free(p);
	return (TRUE);
}

typedef struct Queue         
{
	QueueElementType data[Stack_Size];//定义顺序队列的大小
	int size;
}QueueSq;
void Init(QueueSq *S)           //初始化顺序队列
{
	S->size = -1;
}
void PushQueue(QueueSq* S, QueueElementType d)    //顺序队列入队
{
	if ((S->size + 1) >= Stack_Size)
		return;
	S->data[S->size + 1] = d;
	S->size++;
}
void PopQueue(QueueSq*S, QueueElementType *d)    //顺序队列出队
{
	if (S->size == -1)
		return;
	*d = S->data[0];
	for (int i = 0; i < S->size; ++i)
	{
		S->data[i] = S->data[i + 1];
	}
	S->size--;
}

void menu()
{
	printf("1.链式存储入栈、出栈 \n");
	printf("2.顺序存储入栈、出栈 \n");
	printf("3.链式存储入队、出队 \n");
	printf("4.顺序存储入队、出队 \n");
}
void test1()
{
	int i = 0;
	int d = 0;
	int j = 0;
	int b = 0;
	printf("请输入要入栈元素个数:");
	scanf("%d", &i);
	LinkStack S = (LinkStackNode*)malloc(sizeof(LinkStackNode));
	InitLink(S);
	for (; i > 0; i--)
	{
		printf("请输入要入栈元素:");
		scanf("%d", &d);
		PushLink(S, d);
		DisplayLink(S);
	}
	printf("请输入要出栈元素个数:");
	scanf("%d", &j);
	for (; j > 0; j--)
	{
		PopLink(S, &b);
		DisplayLink(S);
	}
}
void test2()
{
	int i = 0;
	int d = 0;
	int j = 0;
	int b = 0;
	printf("请输入要入栈元素个数:");
	scanf("%d", &i);
	SeqStack S;
	InitSeq(&S);
	for (; i > 0; i--)
	{
		printf("\n请输入要入栈元素:\n");
		scanf("%d", &d);
		PushSeq(&S, d);
	}
	printf("\n请输入要出栈元素个数:");
	scanf("%d", &j);
	for (; j > 0; j--)
	{
		PopSeq(&S, &b);
		GetTop(&S, &b);
	}
}
void test3()
{
	int i = 0;
	int d = 0;
	int j = 0;
	int b;
	printf("请输入要入队元素个数:");
	scanf("%d", &i);
	LinkQueue S;
	InitQueue(&S);
	for (; i > 0; i--)
	{
		printf("\n请输入要入队元素:\n");
		scanf("%d", &d);
		EnterQueue(&S, d);
	}
	printf("\n请输入要出队元素个数:");
	scanf("%d", &j);
	for (; j > 0; j--)
	{
		DeleteQueue(&S, &b);
		printf("%d\n", b);
	}
}
void test4()
{
	int i = 0;
	int d = 0;
	int j = 0;
	int b;
	printf("请输入要入队元素个数:");
	scanf("%d", &i);
	QueueSq S;
	Init(&S);
	for (; i > 0; i--)
	{
		printf("\n请输入要入队元素:\n");
		scanf("%d", &d);
		PushQueue(&S, d);
	}
	printf("\n请输入要出队元素个数:");
	scanf("%d", &j);
	for (; j > 0; j--)
	{
		PopQueue(&S, &b);
		printf("%d\n", b);
	}
}

void test()
{
	int input = 1;
	do{
		menu();
		printf("请选择\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			test1();
			break;
		case 2:
			test2();
			break;
		case 3:
			test3();
			break;
		case 4:
			test4();
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (1);
}
int main()
{
	test();
	system("pause");
	return 0;
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值