-
C语言利用队列的操作实现队列中元素的逆置(逆序输出)
题目均在sdibt acm oj上AC,参考《深入浅出数据结构和算法》教材,逐个复制即可运行,欢迎评论指正!
Description
假设队列中有n个整数,编写算法实现将队列中的元素逆置,要求利用栈实现。
要求:
(1)编写函数分别实现队列初始化、判断队空、判断队满、入队、出队的操作;
(2)编写函数分别实现栈的初始化、判断栈空、栈满、入栈、出栈操作;
(3)主函数调用上述函数,实现所给问题。
Input
输入队列中元素的个数n
依次输入n个数,建立队列。
Output
依次输出逆置后的队列中的元素。
Sample Input
6
1 2 3 4 5 6
Sample Output
6 5 4 3 2 1
HINT
若想完成逆置,并且使用队列和栈的操作,我们必须使用队列的先进先出原则,和栈的先进后出原则。
那么我们两者结合,使用栈来逆置,逆置后的元素随即入队,最后对队列进行一个输出元素的操作,这样就能完成逆置这一操作。
结构体定义如下,队列+栈:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 20
#define STACK_SIZE 30
///
//定义队列的结构体
typedef struct Squeue{
int data[MAXSIZE];//队列内元素的最大长度
int front;//队头
int rear;//队尾
}Squeue;
//定义栈(顺序栈)的结构体
typedef struct{
int *base;
int *top; //栈顶指针
int size;
}seqStack;
///
栈的基本几个操作:初始化、出入栈、取栈顶元素
int InitStack(seqStack *s){
s->base = (int *)malloc(STACK_SIZE* sizeof(seqStack));//动态分配30个单位的stack
//省略是否空间满
s->top = s->base;//栈顶和栈尾相同,栈里面没有元素
s->size = STACK_SIZE;
return 1;
}
int Push(seqStack *s,int x){
*s->top = x;
s->top++;
return 1;
}
int Pop(seqStack *s,int *x){
if(s->top == s->base)return 0;
else{
s->top--;
*x = *s->top;
return 1;
}
}
int GetTop(seqStack *s, int *x){
if(s->top==s->base)
return 0;
else{
*x=*(s->top-1);
return 1;
}
}
队列的几个基本操作:初始化、判断空状态、出入队
//初始化队列
void InitQueue(Squeue *Q)
{
Q->front = Q->rear = 0;
}
//判断队列是否为空
int isQueueEmpty(Squeue *qu)
{
if(qu->front == qu->rear)
{
return 1;
}
else
{
return 0;
}
}
//元素入队操作
int EnQueue(Squeue *qu,int x)
{
//若队满则无法入队——当前个数已经超过最大数量,
//就会出现mod(Maxsize)的结果是队头指针
//比如,队头是1,最大长度是12,若入队第13个元素,则会出现13mod12==1(和队头相等)的情况
//这样就会return false
if((qu->rear + 1) % MAXSIZE == qu->front)
{
return 0;
}
qu->rear = (qu->rear + 1) % MAXSIZE;
qu->data[qu->rear] = x;
return 1;
}
//元素出队操作
int deQueue(Squeue *qu,int *x)
{
//若队空则无法出队
if(qu->front == qu->rear)
{
return 0;
}
qu->front = (qu->front + 1) % MAXSIZE;
*x = qu->data[qu->front];
return 1;
}
主函数:入栈->出栈、入队->出队输出完成逆置
int main()
{
int i , n , x , a;
scanf("%d",&n);
Squeue q;
seqStack s;
InitStack(&s);
InitQueue(&q);
//顺序的入栈
for(i = 0;i < n;i++)
{
scanf("%d",&a);
Push(&s,a);
}
int stackNumber;
for(i=0;i<n;i++)
{
Pop(&s,&stackNumber); //逆序的出栈(遵顼先进后出原则)
EnQueue(&q,stackNumber);//逆序的入队
}
while(!isQueueEmpty(&q))
{
deQueue(&q,&x); //逆序的出队(遵循先进先出原则)
printf("%d ",x); //完成逆转,输出!
}
return 0;
}