要求:
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;
}