前面学习了队列和堆栈的操作,这篇文章将队列与堆栈结合起来学习,即用堆栈来实现队列操作
队列的特点是先进先出,而堆栈的特点是先进后出,那么要用堆栈来实现队列的操作,这里我们使用两个堆栈的操作来实现队列的先进先出,即先将数据压入第一个堆栈,然后再将第一个堆栈的数据取出放入第二个堆栈,再从第二个堆栈中弹出数据。
头文件
/********************************************************************************
* 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 3 + 5 * 4 2 / - 7 +
根据以上原则,我们将运算数压入堆栈中,而将运算符放在外面:
最后结果为25