堆栈与队列

前面学习了队列和堆栈的操作,这篇文章将队列与堆栈结合起来学习,即用堆栈来实现队列操作

队列的特点是先进先出,而堆栈的特点是先进后出,那么要用堆栈来实现队列的操作,这里我们使用两个堆栈的操作来实现队列的先进先出,即先将数据压入第一个堆栈,然后再将第一个堆栈的数据取出放入第二个堆栈,再从第二个堆栈中弹出数据。

这里写图片描述

头文件

/********************************************************************************
 *      Copyright:  (C) 2017 tangyanjun<519656780@qq.com>
 *                  All rights reserved.
 *
 *       Filename:  sq.h
 *    Description:  This head file 
 *
 *        Version:  1.0.0(07/24/2017)
 *         Author:  tangyanjun <519656780@qq.com>
 *      ChangeLog:  1, Release initial version on "07/24/2017 09:25:50 AM"
 *                 
 ********************************************************************************/
#ifndef _SQ_H
#define _SQ_H
#include "../stack_list/sl.h"

typedef struct Queue{
    STACK is;
    STACK os;
} QUEUE;



/* 分配内存并初始化为空队列 */
void queue_init(QUEUE* queue);
/* 释放剩余节点并恢复到初始状态 */
void queue_deinit(QUEUE* queue);
/* 判断是否空 */
bool queue_empty(QUEUE* queue);
/* 压入 */
void queue_push(QUEUE* queue, int data);
/* 弹出 */
int queue_pop(QUEUE* queue);
/* 队首 */
int queue_front(QUEUE* queue);
/* 大小 */
size_t queue_size(QUEUE* queue);



#endif /* _SQ_H*/

C文件

/********************************************************************************
 *      Copyright:  (C) 2017 tangyanjun<519656780@qq.com>
 *                  All rights reserved.
 *
 *       Filename:  sq.c
 *    Description:  This head file 
 *
 *        Version:  1.0.0(07/24/2017)
 *         Author:  tangyanjun <519656780@qq.com>
 *      ChangeLog:  1, Release initial version on "07/24/2017 09:25:50 AM"
 *                 
 ********************************************************************************/
#include "sq.h"

/* 分配内存并初始化为空队列 */
void queue_init(QUEUE* queue)
{
    stack_init(&queue->is);
    stack_init(&queue->os);
}
/* 释放剩余节点并恢复到初始状态 */
void queue_deinit(QUEUE* queue)
{
    stack_deinit(&queue->is);
    stack_deinit(&queue->os);
}

/* 判断是否空 */
bool queue_empty(QUEUE* queue)
{
    return stack_empty(&queue->is) && stack_empty(&queue->os);
}

/* 压入 */
void queue_push(QUEUE* queue, int data)
{
    stack_push(&queue->is, data);
}

/* 弹出 */
int queue_pop(QUEUE* queue)
{
    if (stack_empty(&queue->os))
    {
        while (!stack_empty(&queue->is))
        {
            stack_push(&queue->os, stack_pop(&queue->is));
        }
    }
    return stack_pop(&queue->os);
}

/* 队首 */
int queue_front(QUEUE* queue)
{
    if (stack_empty(&queue->os))
    {
        while (!stack_empty(&queue->is))
        {
            stack_push(&queue->os, stack_pop(&queue->is));
        }
    }
    return stack_top(&queue->os);
}
/* 大小 */
size_t queue_size(QUEUE* queue)
{
    return stack_size(&queue->is) + stack_size(&queue->os);
}




测试程序

/*********************************************************************************
 *      Copyright:  (C) 2017 tangyanjun<519656780@qq.com>
 *                  All rights reserved.
 *
 *       Filename:  sq_test.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(07/24/2017)
 *         Author:  tangyanjun <519656780@qq.com>
 *      ChangeLog:  1, Release initial version on "07/24/2017 03:08:26 PM"
 *                 
 ********************************************************************************/
#include "sq.h"
#include <stdio.h>
int main(int argc, char **argv)
{
    QUEUE queue;
    queue_init(&queue);
    queue_push(&queue, 1);
    queue_push(&queue, 2);
    queue_push(&queue, 3);
    queue_push(&queue, 4);
    queue_push(&queue, 5);
    printf("%d\n", queue_pop(&queue));
    printf("%d\n", queue_pop(&queue));
    printf("%d\n", queue_pop(&queue));
    queue_push(&queue, 6);
    queue_push(&queue, 7);
    queue_push(&queue, 8);
    while (!queue_empty(&queue))
    {
        printf("%d\n", queue_pop(&queue));
    }
    queue_deinit(&queue);

    return 0;
}

将这两个C文件和之前的链式堆栈sl.c文件一起编译,得出队列的先进先出操作。

结果:

[tangyanjun@VM_216_80_centos queue]$ gcc sq.c sq_test.c sl.c
[tangyanjun@VM_216_80_centos queue]$ a.out 
1
2
3
4
5
6
7
8

在数据结构的试题中,有一道题是使用逆波兰表达式来计算我们的等式:

给出中缀表达式,求其后缀表达式并且计算

ex:(1+3)*5-4/2+7

逆波兰表达式的原理:

  1. 运算数在前,运算符在后
  2. 同级运算符左前右后,不同级运算符,高前低后
  3. 括号内运算符在前

先写出表达式的逆波兰表达式:1 3 + 5 * 4 2 / - 7 +
根据以上原则,我们将运算数压入堆栈中,而将运算符放在外面:

这里写图片描述

最后结果为25

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值