阅读过程之中可能会花费比较多的时间:建议直接翻到最后,有完整的代码可以使用
(tips:仅供学习使用)
程序准备工作
代码语言:javascript复制#include
#include
#include
#include
#define MaxSize 100 //最大元素个数
typedef int ElemType;
typedef struct //顺序栈的类型定义
{
ElemType data[MaxSize]; //栈元素存储空间
int top; //栈顶指针
}SeqStack;
typedef struct //循环顺序队的类型定义
{
ElemType data[MaxSize]; //队列元素存储空间
int front; //队头指针
int rear; //队尾指针
}CircSeqQueue;
先准备工作看看程序运行的结果
栈表具有先进后出,后进后出的功能:
下面看看功能的实现
下面看看入栈,出栈,读取栈顶元素,栈置空的函数的实现
代码语言:javascript复制void StackInitial(SeqStack *pS) //创建一个由指针pS所指向的空栈
{
pS->top= -1;
}
int isEmpty(SeqStack *pS) //顺序栈为空时返回1,否则返回。
{
return pS->top== -1;
}
int isFull (SeqStack * pS) //栈为满时返回1,否则返回0
{
return pS->top >=MaxSize-1;
}
void Push(SeqStack *pS, ElemType e) //若栈不满,则元素e进栈
{
if(pS->top==MaxSize-1)
{
printf("栈满n");
return ;
}
else {
pS->top ;
pS->data[pS->top]=e;
return ;
}
}
ElemType Pop(SeqStack *pS) //若栈不为空,则删除栈顶元素,并返回它的值
{
if(isEmpty(pS))
return -1;
else{
return pS->data[pS->top--];
}
}
ElemType GetTop(SeqStack *pS) //若栈不为空,则返回栈顶元素的值
{
if(isEmpty(pS))
return -1;
else
return pS->data[pS->top];
}
void MakeEmpty(SeqStack *pS) //将由指针pS所指向的栈变为空栈
{
return pS->top= -1;
}
队列操作,这次的队列我用的是循环队列,队列的主要功能是先进先出,后进后出,也就可以类比排队
代码语言:javascript复制int IsEmpty(CircSeqQueue *pQ) //循环顺序队列为空时返回1,否则返回0
{
return pQ->front==pQ->rear;
}
int IsFull(CircSeqQueue *pQ) //循环队列为满时返回1,否则返回。
{
return(pQ->rear 1) %MaxSize==pQ->front;
}
void EnQueue(CircSeqQueue *pQ,ElemType e)
{
//若队列不满,则元素e进队
if((pQ->rear 1)%MaxSize==pQ->front)
{
printf("队满!n");
return ;
}
else{
pQ->data[pQ->rear]=e;
pQ->rear=(pQ->rear 1)%MaxSize;
return ;
}
}
ElemType DeQueue(CircSeqQueue *pQ)
{
//若循环队列不为空,则删除队头元素,并返回它的值
if(pQ->rear==pQ->front)
{
printf("空队!n");
return 0;
}
else{
return pQ->data[pQ->front ];
}
}
ElemType GetFront(CircSeqQueue *pQ) //若队列不为空,则返回队头元素值
{
if (IsEmpty(pQ))
{
printf("空队列! n");
exit(1);
}
return pQ->data[(pQ->front)%MaxSize];
}
void MakeEmpty2(CircSeqQueue *pQ) //将指针pQ所指向的队列变为空
{
pQ->front=pQ->rear=0;
}
复制进C编辑器即可使用
代码语言:javascript复制#include
#include
#include
#include
#define MaxSize 100 //最大元素个数
typedef int ElemType;
typedef struct //顺序栈的类型定义
{
ElemType data[MaxSize]; //栈元素存储空间
int top; //栈顶指针
}SeqStack;
typedef struct //循环顺序队的类型定义
{
ElemType data[MaxSize]; //队列元素存储空间
int front; //队头指针
int rear; //队尾指针
}CircSeqQueue;
void StackInitial(SeqStack *pS) //创建一个由指针pS所指向的空栈
{
pS->top= -1;
}
int isEmpty(SeqStack *pS) //顺序栈为空时返回1,否则返回。
{
return pS->top== -1;
}
int isFull (SeqStack * pS) //栈为满时返回1,否则返回0
{
return pS->top >=MaxSize-1;
}
void Push(SeqStack *pS, ElemType e) //若栈不满,则元素e进栈
{
if(pS->top==MaxSize-1)
{
printf("栈满n");
return ;
}
else {
pS->top ;
pS->data[pS->top]=e;
return ;
}
}
ElemType Pop(SeqStack *pS) //若栈不为空,则删除栈顶元素,并返回它的值
{
if(isEmpty(pS))
return -1;
else{
return pS->data[pS->top--];
}
}
ElemType GetTop(SeqStack *pS) //若栈不为空,则返回栈顶元素的值
{
if(isEmpty(pS))
return -1;
else
return pS->data[pS->top];
}
void MakeEmpty(SeqStack *pS) //将由指针pS所指向的栈变为空栈
{
return pS->top= -1;
}
void QueueInitial(CircSeqQueue *pQ)
{
//创建一个由指针PQ所指向的空顺序循环队列
pQ->front=pQ->rear=0;
}
int IsEmpty(CircSeqQueue *pQ) //循环顺序队列为空时返回1,否则返回0
{
return pQ->front==pQ->rear;
}
int IsFull(CircSeqQueue *pQ) //循环队列为满时返回1,否则返回。
{
return(pQ->rear 1) %MaxSize==pQ->front;
}
void EnQueue(CircSeqQueue *pQ,ElemType e)
{
//若队列不满,则元素e进队
if((pQ->rear 1)%MaxSize==pQ->front)
{
printf("队满!n");
return ;
}
else{
pQ->data[pQ->rear]=e;
pQ->rear=(pQ->rear 1)%MaxSize;
return ;
}
}
ElemType DeQueue(CircSeqQueue *pQ)
{
//若循环队列不为空,则删除队头元素,并返回它的值
if(pQ->rear==pQ->front)
{
printf("空队!n");
return 0;
}
else{
return pQ->data[pQ->front ];
}
}
ElemType GetFront(CircSeqQueue *pQ) //若队列不为空,则返回队头元素值
{
if (IsEmpty(pQ))
{
printf("空队列! n");
exit(1);
}
return pQ->data[(pQ->front)%MaxSize];
}
void MakeEmpty2(CircSeqQueue *pQ) //将指针pQ所指向的队列变为空
{
pQ->front=pQ->rear=0;
}
void output()
{
int i;
for (i=0;i<10; i )
printf(" ");
for (i=0; i< 32; i )
printf("*");
printf("n");
}
void main1()
{
int i;
output();
for (i=0; i< 10; i )printf(" ");
printf("* ");
printf("1.入栈一个元素");
for (i=0; i< 16; i ) printf(" ");
printf("*");
printf("n");
for (i=0; i< 10; i )printf(" ");
printf("* ");
printf("2.出栈一个元素");
for (i=0; i< 16; i ) printf(" ");
printf("*");
printf("n");
for (i=0; i< 10; i )printf(" ");
printf("* ");
printf("3.读栈顶元素");
for (i=0; i< 16; i ) printf(" ");
printf("*");
printf("n");
for (i=0; i< 10; i )printf(" ");
printf("* ");
printf("4.置栈空");
for (i=0; i< 16; i ) printf(" ");
printf("*");
printf("n");
for (i=0; i< 10; i )printf(" ");
printf("* ");
printf("5.入队一个元素");
for (i=0; i< 16; i ) printf(" ");
printf("*");
printf("n");
for (i=0; i< 10; i )printf(" ");
printf("* ");
printf("6.出队一个元素");
for (i=0; i< 16; i ) printf(" ");
printf("*");
printf("n");
for (i=0; i< 10; i )printf(" ");
printf("* ");
printf("7.读队首元素");
for (i=0; i< 14; i ) printf(" ");
printf("*");
printf("n");
for (i=0; i< 10; i )printf(" ");
printf("* ");
printf("8.置队空");
for (i=0; i< 18; i ) printf(" ");
printf("*");
printf("n");
for (i=0; i< 10; i )printf(" ");
printf("* ");
printf("0.退 出");
for (i=0; i< 8; i ) printf(" ");
printf("*");
printf("n");
output();
}
void main () //主函数
{
SeqStack *pS;
CircSeqQueue*pQ;
ElemType e;
int k=1,m,i,n,c,d;
pS=(SeqStack *)malloc(sizeof(SeqStack));
StackInitial(pS);
pQ=(CircSeqQueue *)malloc(sizeof(CircSeqQueue));
QueueInitial(pQ);
main1();
while (k)
{
printf("请选择0一8:");
scanf ("%d", &m);
switch (m)
{
case 0:
return;
case 1:
{
printf("输入数n,再输入n个元素,入栈:");
scanf ("%d", &n);
for (i=0;i