堆栈与队列
来源:互联网 发布:安卓绘画软件知乎 编辑:程序博客网 时间: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 3 + 5 * 4 2 / - 7 +
根据以上原则,我们将运算数压入堆栈中,而将运算符放在外面:
最后结果为25
阅读全文
1 0
- 堆栈与队列
- 堆栈与队列模拟
- 堆栈与队列
- java堆栈与队列
- python 堆栈与队列
- 堆栈与队列
- 堆栈与队列
- 队列与堆栈
- 堆栈与队列
- 堆栈与队列
- java队列与堆栈
- 链队列与堆栈操作
- java中的队列与堆栈
- 数据结构之堆栈与队列
- 堆栈与队列的区别
- C# 堆栈与队列的小测试
- STL通用容器之 队列与堆栈
- “数组、堆栈”与“链表、队列”的区别
- nodejs使用domain捕获工作进程异常
- 常用git命令
- array_map函数在PHP类中调用内部方法简介
- 利用HAProxy代理SQL Server
- HDU-1599 find the mincost route
- 堆栈与队列
- Java JDBC
- 关于core.dao泛型的写法
- Android自定义View 之构造函数
- C++中mutable、volatile关键字
- 最小值和最大值(2n-2)
- js不刷新页面,改变url
- (嵌入式)关于arm中的存储控制器(二)
- 阿里云