题目:
1.编写函数,采用链式存储实现栈的初始化、入栈、出栈操作
2.编写函数,采用顺序存储实现栈的初始化、入栈、出栈操作
3.编写函数,采用链式存储实现队列的初始化、入队、出队操作
4.编写函数,采用顺序存储实现队列的初始化、入队、出队操作
5.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法
题目分析:
1.顺序栈的类型定义
#define MAX 100 //栈的最大值
typedef struct
{
ElemType *base;
int top;
} SqStack;
2.链栈的类型定义
typedef struct SqNode
{
SElemType data;
SqNode *Link;
} *Sqptr;
typedef struct
{
Sqptr top; //栈项指针
}
3.顺序队列的类型定义
#define MAX 100 //队列的最大长度
typedef struct
{
ElemType *base;
int front,rear;
} SqQueue;
4.单链队列的类型定义
typedef struct QNode
{
QElemType data;
struct QNode *next;
} *QueuePtr;
typedef struct
{
QueuePtr frout; //队头指针
QueuePtr rear; //队尾指针
}
下面是具体的程序:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#define OVERFLOW -2
#define ERROR 0
#define OK 1
#define MAX 100 //栈的最大值
typedef int SElemType;
typedef int QElemType;
typedef struct
{
SElemType *base;
SElemType *top;
}SqStack;
SqStack InitStacka( ) //顺序存储实现栈的初始化
{
SqStack S;
S.base = ( SElemType * )malloc( MAX *sizeof( SElemType ));
if( !S.base )
exit( OVERFLOW );
S.top = S.base;
return(S);
}
void Pusha(SqStack &S, int x) //顺序存储实现栈的入栈操作
{
if(S.top - S.base >= MAX)
{
exit(OVERFLOW);
}
*S.top++ = x;
}
void Popa(SqStack &S) //顺序存储实现栈的出栈操作
{
SElemType *p;
int x;
if(S.top == S.base)
{
return ;
}
else
{
p = S.top;
x = * --S.top;
printf("\t删除的栈顶元素是%d\n\t出栈操作完成后的栈为:\n", x);
}
}
void printa(SqStack S) //输出
{
SElemType *p;
p = S.base;
printf("\t");
while(p != S.top)
{
printf("%d ", *(p++));
}
printf("\n");
}
typedef struct SqNode
{
SElemType data;
SqNode *Link;
}*Sqptr,NODE;
typedef struct
{
Sqptr top;
}Stack;
Stack InitStackb() //链式存储实现栈的初始化
{
Stack S;
S.top = ( Sqptr )malloc( sizeof( NODE ) );
if( !S.top )
{
exit (OVERFLOW);
}
S.top -> Link = NULL;
return(S);
}
void Pushb(Stack &S, int x) //链式存储实现栈的入栈操作
{
Sqptr p;
p = ( Sqptr )malloc( sizeof( NODE ) );
if( !p )
{
return ;
}
p -> data = x;
p -> Link = S.top -> Link;
S.top -> Link = p;
}
void Popb(Stack &S) //链式存储实现栈的出栈操作
{
int x;
Sqptr p;
if(S.top -> Link == NULL)
{
return ;
}
else
{
p = S.top -> Link;
x = p -> data;
S.top -> Link = p -> Link;
printf("\t删除的栈顶元素是%d\n", x);
free(p);
}
}
typedef struct QNode
{
QElemType data;
struct QNode *next;
}*QueuePtr,QNode;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
LinkQueue InitQueue() //链式存储实现队列的初始化
{
LinkQueue Q;
Q.front = Q.rear = ( QueuePtr )malloc( sizeof( QNode ) );
if( !Q.front )
{
exit (OVERFLOW);
}
Q.front -> next = NULL;
return(Q);
}
void EnQueue(LinkQueue &Q, QElemType x) //链式存储实现队列的入队操作
{
QueuePtr p;
p = ( QueuePtr )malloc( sizeof( QNode ) );
if( !p )
{
exit(OVERFLOW);
}
p -> data = x;
p -> next = NULL;
Q.rear -> next = p;
Q.rear = p;
}
void DeQueue(LinkQueue &Q) //链式存储实现队列的出队操作
{
int x;
if(Q.front == Q.rear)
{
return ;
}
QueuePtr p;
p = Q.front -> next;
x = p -> data;
printf("\t删除的队头元素是%d\n", x);
Q.front -> next = p -> next;
if(Q.rear == p)
{
Q.rear = Q.front;
}
free(p);
return;
}
typedef struct
{
SElemType *base;
int front, rear;
}SqQueue;
SqQueue InitQueueb() //顺序存储实现队列的初始化
{
SqQueue S;
S.base = ( SElemType * )malloc( MAX *sizeof( SElemType ));
if( !S.base )
{
exit(OVERFLOW);
}
S.front = S.rear = 0;
return(S);
}
void EnQueueb(SqQueue &S, int x) //顺序存储实现队列的入队操作
{
if((S.rear+1) % MAX == S.front)
{
return ;
}
S.base[S.rear] = x;
S.rear = (S.rear+1) % MAX;
}
void DeQueueb(SqQueue &S) //顺序存储实现队列的出队操作
{
int x;
if(S.front == S.rear)
{
return ;
}
x = S.base[S.front];
S.front = (S.front+1) % MAX;
printf("\t删除的队头元素是:%d\n", x);
}
int main()
{
int choice;
int n, x;
printf("\t1.使用链式存储实现栈的初始化、入栈、出栈操作\n");
printf("\t2.使用顺序存储实现栈的初始化、入栈、出栈操作\n");
printf("\t3.使用链式存储实现队列的初始化、入栈、出栈操作\n");
printf("\t4.使用顺序存储实现队列的初始化、入栈、出栈操作\n");
printf("\t请选择:");
scanf("%d", &choice);
switch(choice)
{
case 1:
Stack Sa;
printf("\t1.链式存储实现栈的初始化\n");
printf("\t2.链式存储实现栈的入栈操作\n");
printf("\t3.链式存储实现栈的出栈操作\n");
while(1)
{
printf("\t请选择:");
scanf("%d", &n);
switch(n)
{
case 1:
Sa = InitStackb();
printf("\t链式存储栈的初始化完成!\n");
break;
case 2:
printf("\t以'0'结束\n");
printf("\t");
scanf("%d", &x);
while(x)
{
Pushb(Sa, x);
scanf("%d", &x);
}
printf("\t链式存储栈的入栈操作完成!\n");
break;
case 3:
Popb(Sa);
break;
}
}
break;
case 2:
SqStack S;
printf("\t1.顺序存储实现栈的初始化\n");
printf("\t2.顺序存储实现栈的入栈操作\n");
printf("\t3.顺序存储实现栈的出栈操作\n");
while(1)
{
printf("\t请选择:");
scanf("%d", &n);
switch(n)
{
case 1:
S = InitStacka();
printf("\t顺序存储栈的初始化完成!\n");
break;
case 2:
printf("\t以'0'结束!\n");
printf("\t");
scanf("%d", &x);
while(x)
{
Pusha(S, x);
scanf("%d", &x);
}
printf("\t顺序存储栈的入栈操作完成!\n");
printa(S);
break;
case 3:
Popa(S);
printa(S);
break;
}
}
break;
case 3:
LinkQueue Q;
printf("\t1.链式存储实现队的初始化\n");
printf("\t2.链式存储实现队的入栈操作\n");
printf("\t3.链式存储实现队的出栈操作\n");
while(1)
{
printf("\t请选择:");
scanf("%d", &n);
switch(n)
{
case 1:
Q = InitQueue();
printf("\t链式存储队的初始化完成!\n");
break;
case 2:
printf("\t以'0'结束\n");
printf("\t");
scanf("%d", &x);
while(x)
{
EnQueue(Q, x);
scanf("%d", &x);
}
printf("\t链式存储队的入栈操作完成!\n");
break;
case 3:
DeQueue(Q);
break;
}
}
break;
case 4:
SqQueue Sv;
printf("\t1.顺序存储实现队的初始化\n");
printf("\t2.顺序存储实现队的入栈操作\n");
printf("\t3.顺序存储实现队的出栈操作\n");
while(1)
{
printf("\t请选择:");
scanf("%d", &n);
switch(n)
{
case 1:
Sv = InitQueueb();
printf("\t链式存储栈的初始化完成!\n");
break;
case 2:
printf("\t以'0'结束\n");
printf("\t");
scanf("%d", &x);
while(x)
{
EnQueueb(Sv, x);
scanf("%d", &x);
}
printf("\t链式存储栈的入栈操作完成!\n");
break;
case 3:
DeQueueb(Sv);
break;
}
}
break;
}
system("pause");
return 0;
}