由于编者时间以及水平有限,如有错误,敬请斧正 ʘᴗʘ
本文是我发布过的文章部分,主界面在这::顺序栈和队列的操作以及栈逆置队列(C语言)
利用栈先进后出的规则,可以对队列逆置
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct///定义队列
{
int* base;
int front;
int rear;
} SqQueue;
void InitQueue(SqQueue* Q)///初始化队列
{
Q->base = (int*)malloc(sizeof(int) * MAXSIZE);
Q->front = Q->rear = 0;
}
void EnQueue(SqQueue* Q,int x)///元素入队操作
{
if ((Q->rear + 1) % MAXSIZE == Q->front)
{
printf("队列满了\n");
return;
}
Q->base[Q->rear] = x;
Q->rear = (Q->rear + 1) % MAXSIZE;
}
void DelQueue(SqQueue* Q,int *e)//元素出队操作
{
if (Q->front == Q->rear)
{
printf("队列空的");
return;
}
*e=Q->base[Q->front];
Q->front = (Q->front + 1) % MAXSIZE;
}
void PrintQueue(SqQueue Q)//打印队列
{
while (Q.front != Q.rear)
{
printf("队元素:%d ", Q.base[Q.front]);
Q.front=(Q.front+1)%MAXSIZE;
}
}
typedef struct///定义栈
{
int *base;
int top;
} SqStack;
void InitStack(SqStack* S)///初始化栈
{
S->base = (int*)malloc(sizeof(int) * MAXSIZE);
S->top = -1;
}
void Push(SqStack* S,int x)//入栈
{
if (S->top == MAXSIZE-1)
{
printf("栈满了");
return;
}
S->top++;
S->base[S->top] = x;
}
void Pop(SqStack* S,int *e)/出栈
{
if (S->top == -1)
{
printf("栈空了");
return;
}
*e=S->base[S->top];
S->top--;
}
void ReQueue(SqQueue *Q,SqStack *S)/逆置栈的函数
{
int e;
while(Q->front!=Q->rear)
{
DelQueue(Q,&e);///元素通过e出队,随后e被栈接收,e作为中间值暂存元素
Push(S,e);
}
while(S->top!=-1)
{
Pop(S,&e);//元素e出栈,随后e被队列接收,由于栈先进后出的原则,原先的队列就被逆置了
EnQueue(Q,e);
}
}
int main()
{
SqQueue Q;
InitQueue(&Q);
SqStack S;
InitStack(&S);
int num,i,x,e;
printf("输入队列个数");
scanf("%d",&num);
for(i=0; i<num; i++)
{
printf("输入入队元素");
scanf("%d",&x);
EnQueue(&Q,x);
}
printf("开始逆置\n");
ReQueue(&Q,&S);
printf("逆置后的队列:");
PrintQueue(Q);
}