【输入形式】输入的第一行为队列元素个数,第二行为队列从首至尾的元素
【输出形式】输出队列的逆置
【样例输入】
3
1 2 3
【样例输出】
3 2 1
【评分标准】
需采用队列与栈的知识,否则不能得分
尝试:
使用一个队列一个栈进行实现,利用栈先入后出得特性来实现。均使用链表进行实现。
缺点:
在建立栈与队列的时候对于top与base指针是否各占一个单独空间不储存数据问题非常混乱。在编写过程中开始清醒编写一半就开始有些疑惑。
实现代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct node//链表结点
{
int num;
struct node* next;
}node;
typedef struct Queue//队列
{
node* front;//头指针
node* rear; //尾指针
}Queue;
typedef struct Stack//栈
{
node* top;
node* base;
}Stack;
void InitQueue(Queue *q)//初始化
{
q->front=NULL;
q->rear=NULL;
}
void InputQueue(Queue* q,int n)//输入值放入队列
{
int i;
q->front=(node*)malloc(sizeof(node));
q->rear=q->front;
node* flag=q->rear;
for(i=0;i<n;i++)
{
scanf("%d",&q->rear->num);
q->rear=(node*)malloc(sizeof(node));
flag->next=q->rear;
flag=q->rear;
}
q->rear->next=NULL;
}
void InitStack(Stack*s)//初始化堆栈
{
s->base=NULL;
s->top=NULL;
}
int PopQueue(Queue*q)//弹出队列中的一个数据
{
node* temp=q->front;
q->front=q->front->next;
return temp->num;
}
void PushStack(Stack*s,Queue*q,int n)//向堆栈中推入一个数据
{
int i;
s->base=(node*)malloc(sizeof(node));
s->top=s->base;
for(i=0;i<n;i++)
{
node*flag=(node*)malloc(sizeof(node));
flag->num=PopQueue(q);
flag->next=s->top;//尾插法
s->top=flag;
}
}
int PopStack(Stack*s)//弹出堆栈中的一个数据
{
node*temp=s->top;
s->top=s->top->next;
return temp->num;
}
void PushQueue(Queue*q,Stack*s,int n)
{
int i;
for(i=0;i<n;i++)
{
node*flag=(node*)malloc(sizeof(node));
flag->num=PopStack(s);
q->rear->next=flag;
q->rear=flag;
q->rear->next=NULL;
}
}
void ChangeQueue(Queue* q,Stack *s,int n)//将队列中的数据放入堆栈中再将堆栈中的数据放入队列中
{
PushStack(s,q,n);
PushQueue(q,s,n);
}
void PrintQueue(Queue*q)
{
q->front=q->front->next;
while(q->front!=NULL)
{
printf("%d ",q->front->num);
q->front=q->front->next;
}
}
int main()
{
int n;//队列数据总数
scanf("%d",&n);
Queue* q=(Queue*)malloc(sizeof(Queue));//创建一个新队列
InitQueue(q);
InputQueue(q,n);
Stack*s=(Stack*)malloc(sizeof(Stack));//创建一个堆栈
InitStack(s);
ChangeQueue(q,s,n);
PrintQueue(q);
return 0;
}