两个队列实现一个栈

  关于两个栈实现一个队列的问题:两个栈实现一个队列
这篇博客我们讲两个队列实现一个栈。


栈:后进先出
队列:先进先出


分析:
  入栈:
   哪一个队列有元素便入哪一个队列。
  出栈:
这里写图片描述
  返回栈顶元素:

这里写图片描述
  栈的大小
  两个队列的大小之和。
  栈判空
  两个队列均为空。


代码实现:

  设置一个栈由两个队列组成。队列为不带头结点的单链表,有两个指针,分别指向队头和队尾。

#define DataType int
typedef struct QNode
{
    DataType data;
    struct QNode *next;
}QNode;
typedef struct queue
{
    QNode *front;
    QNode *rear;
}Queue;
typedef struct Stack
{
    Queue q1;
    Queue q2;
}stack;

初始化栈
  初始化栈即初始化两个队列。

//初始化队列
void InitQueue(Queue *queue)
{
    assert(queue);
    queue->front = queue->rear = NULL;
}
//初始化栈
void InitStack(stack *s)
{
    assert(s);
    InitQueue(&s->q1);
    InitQueue(&s->q2);
}

压栈
  两个队列实现一个栈的方法必有一个队列为空,压栈时两个队列哪一个不为空,便往哪一个队列里面插元素,插元素时采用尾插法。

QNode *BuyNode(int d)
{
    QNode *node = (QNode*)malloc(sizeof(QNode));
    if (node == NULL)
    {
        printf("空间开辟失败!\n");
        return NULL;
    }
    node->data = d;
    node->next = NULL;
    return node; 
}
//压队列
void PushQueue(Queue *queue,DataType d)
{
    assert(queue);
    QNode *newnode = NULL;
    //队列为空
    if (queue->front == NULL)
    {
        queue->front = queue->rear = BuyNode(d);
    }
    //队列不为空
    else
    {
        //尾插
        newnode = BuyNode(d);
        queue->rear->next = newnode;
        queue->rear = newnode;
    }
} 
//队列为空
int EmptyQueue(Queue *queue)
{
    assert(queue);
    return queue->front == NULL;
}
//入栈
void PushStack(stack *s, DataType d)
{
    assert(s);
    if (!EmptyQueue(&s->q2))
    {
        //压入队列2
        PushQueue(&s->q2, d);
    }
    else
    {
        //压入队列1
        PushQueue(&s->q1, d);
    }
}

出栈
  哪一个队列不为空,将此队列的n-1个元素移入另一个队列,然后出队列即出栈。出队列采用头删法。

//头删
void Deletehead(Queue *queue)
{
    QNode *cur = NULL;
    if (queue->front == NULL)
    {
        printf("队列为空,无法删除!\n");
        return;
    }
    else if (queue->front == queue->rear)
    {
        free(queue->front);
        queue->front = queue->rear = NULL;
    }
    else
    {
        cur = queue->front;
        queue->front = queue->front->next;
        free(cur);
        cur = NULL;
    }
}
//出队列
void PopQueue(Queue *queue)
{
    QNode *cur = NULL;
    assert(queue);
    //tou删
    Deletehead(queue);
}

//返回队头元素
DataType QueueFront(Queue *queue)
{
    assert(queue);
    return queue->front->data;
}
//队列为空
int EmptyQueue(Queue *queue)
{
    assert(queue);
    return queue->front == NULL;
}
//栈为空
int EmptyStack(stack *s)
{
    assert(s);
    return EmptyQueue(&s->q1) && EmptyQueue(&s->q2);
}
//出栈
void PopStack(stack *s)
{
    assert(s);
    if (EmptyStack(s))
    {
        printf("栈为空!\n");
        return;
    }
    else if (!EmptyQueue(&s->q1))
    {
        while (QueueSize(&s->q1)>1)
        {
            PushQueue(&s->q2, QueueFront(&s->q1));
            PopQueue(&s->q1);
        }
        PopQueue(&s->q1);
    }
    else
    {
        while (QueueSize(&s->q2)>1)
        {
            PushQueue(&s->q1, QueueFront(&s->q2));
            PopQueue(&s->q2);
        }
        PopQueue(&s->q2);
    }
}

返回栈顶元素
  哪一个队列不空,返回它rear指针指向的数据返回。

//返回队尾元素
DataType QueueBack(Queue *queue)
{
    assert(queue);
    return queue->rear->data;
}
//栈顶元素
DataType TopStack(stack *s)
{
    if (EmptyStack(s))
    {
        printf("栈为空!\n");
        return -1;
    }
    else if (!EmptyQueue(&s->q1))
    {
        //返回队尾元素
        return QueueBack(&s->q1);
    }
    else
    {
        //返回队尾元素
        return QueueBack(&s->q2);
    }
}

栈的大小
  即两个队列的大小和。

//队列的大小
int QueueSize(Queue *queue)
{
    QNode *cur = NULL;
    int count = 0;
    assert(queue);
    cur = queue->front;
    while (cur)
    {
        count++;
        cur = cur->next;
    }
    return count;
}
//栈的大小
int SizeStack(stack *s)
{
    assert(s);
    return QueueSize(&s->q1) + QueueSize(&s->q2);
}

                                  整体代码:

.h文件


#include<stdlib.h>
#include<assert.h>
#include<stdio.h>


#define DataType int
typedef struct QNode
{
    DataType data;
    struct QNode *next;
}QNode;
typedef struct queue
{
    QNode *front;
    QNode *rear;
}Queue;


typedef struct Stack
{
    Queue q1;
    Queue q2;
}stack;

//初始化栈
void InitStack(stack *s);
//入栈
void PushStack(stack *s,DataType d);
//出栈
void PopStack(stack *s);
//栈顶元素
DataType TopStack(stack *s);
//队列的大小
int SizeStack(stack *s);

.c文件

#include"queue.h"


//初始化队列
void InitQueue(Queue *queue)
{
    assert(queue);
    queue->front = queue->rear = NULL;
}
//初始化栈
void InitStack(stack *s)
{
    assert(s);
    InitQueue(&s->q1);
    InitQueue(&s->q2);
}


QNode *BuyNode(int d)
{
    QNode *node = (QNode*)malloc(sizeof(QNode));
    if (node == NULL)
    {
        printf("空间开辟失败!\n");
        return NULL;
    }
    node->data = d;
    node->next = NULL;
    return node; 
}
//压队列
void PushQueue(Queue *queue,DataType d)
{
    assert(queue);
    QNode *newnode = NULL;
    //队列为空
    if (queue->front == NULL)
    {
        queue->front = queue->rear = BuyNode(d);
    }
    //队列不为空
    else
    {
        //尾插
        newnode = BuyNode(d);
        queue->rear->next = newnode;
        queue->rear = newnode;
    }
} 
//队列为空
int EmptyQueue(Queue *queue)
{
    assert(queue);
    return queue->front == NULL;
}
//入栈
void PushStack(stack *s, DataType d)
{
    assert(s);
    if (!EmptyQueue(&s->q2))
    {
        //压入队列2
        PushQueue(&s->q2, d);
    }
    else
    {
        //压入队列1
        PushQueue(&s->q1, d);
    }
}


//队列的大小
int QueueSize(Queue *queue)
{
    QNode *cur = NULL;
    int count = 0;
    assert(queue);
    cur = queue->front;
    while (cur)
    {
        count++;
        cur = cur->next;
    }
    return count;
}
//头删
void Deletehead(Queue *queue)
{
    QNode *cur = NULL;
    if (queue->front == NULL)
    {
        printf("队列为空,无法删除!\n");
        return;
    }
    else if (queue->front == queue->rear)
    {
        free(queue->front);
        queue->front = queue->rear = NULL;
    }
    else
    {
        cur = queue->front;
        queue->front = queue->front->next;
        free(cur);
        cur = NULL;
    }
}
//出队列
void PopQueue(Queue *queue)
{
    QNode *cur = NULL;
    assert(queue);
    //tou删
    Deletehead(queue);
}

//返回队头元素
DataType QueueFront(Queue *queue)
{
    assert(queue);
    return queue->front->data;
}
//栈为空
int EmptyStack(stack *s)
{
    assert(s);
    return EmptyQueue(&s->q1) && EmptyQueue(&s->q2);
}
//出栈
void PopStack(stack *s)
{
    assert(s);
    if (EmptyStack(s))
    {
        printf("栈为空!\n");
        return;
    }
    else if (!EmptyQueue(&s->q1))
    {
        while (QueueSize(&s->q1)>1)
        {
            PushQueue(&s->q2, QueueFront(&s->q1));
            PopQueue(&s->q1);
        }
        PopQueue(&s->q1);
    }
    else
    {
        while (QueueSize(&s->q2)>1)
        {
            PushQueue(&s->q1, QueueFront(&s->q2));
            PopQueue(&s->q2);
        }
        PopQueue(&s->q2);
    }
}


//栈的大小
int SizeStack(stack *s)
{
    assert(s);
    return QueueSize(&s->q1) + QueueSize(&s->q2);
}


//返回队尾元素
DataType QueueBack(Queue *queue)
{
    assert(queue);
    return queue->rear->data;
}
//栈顶元素
DataType TopStack(stack *s)
{
    if (EmptyStack(s))
    {
        printf("栈为空!\n");
        return -1;
    }
    else if (!EmptyQueue(&s->q1))
    {
        //返回队尾元素
        return QueueBack(&s->q1);
    }
    else
    {
        //返回队尾元素
        return QueueBack(&s->q2);
    }
}

测试文件:

#include"queue.h"

void Testqueue()
{
    stack s;
    //初始化栈
    InitStack(&s);
    //入栈
    PushStack(&s, 1);
    PushStack(&s, 2);
    PushStack(&s, 3);
    PushStack(&s, 4);
    PushStack(&s, 5);
    PushStack(&s, 6);
    printf("Top=%d\n", TopStack(&s));
    printf("size=%d\n", SizeStack(&s));

    //出栈
    PopStack(&s);
    printf("Top=%d\n", TopStack(&s));
    printf("size=%d\n", SizeStack(&s));
    PushStack(&s, 3);
    PushStack(&s, 4);

    printf("Top=%d\n", TopStack(&s));
    printf("size=%d\n", SizeStack(&s));
}
int main()
{
    Testqueue();
    system("pause");
    return 0;
}

这里写图片描述
运行结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值