堆栈与队列

来源:互联网 发布:安卓绘画软件知乎 编辑:程序博客网 时间:2024/06/14 16:34

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

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

这里写图片描述

头文件

/******************************************************************************** *      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 12345678

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

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

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

逆波兰表达式的原理:

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

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

这里写图片描述

最后结果为25

原创粉丝点击