已知Q是一个非空队列,S是一个空栈。仅使用少量工作变量以及对队列和栈的基本操作,编写一个算法,将队列Q中的所有元素逆置。

【输入形式】输入的第一行为队列元素个数,第二行为队列从首至尾的元素

【输出形式】输出队列的逆置

【样例输入】

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;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值