两个栈实现一个队列
2016-01-04 22:22
267 查看
#include <stdio.h> #include <string.h> #include <stdlib.h> #include "stack.h" /*思路:入队的放stack1,出队从stack2出,如果stack2为空,则先将stack1的内容依次压入stack2中*/ /*出队,返回出队的值的指针!*/ int* dequeue(t_stack *s1, t_stack *s2) { int *p_value; if(!s1 || !s2) return NULL; if(s2->top == 0) { /*stack2为空,先将stack1中内容弹出并压入stack2中*/ while(s1->top) { p_value = (int *)(s1->pop(s1)); s2->push(s2, (void *)p_value, sizeof(int)); } } p_value = (int *)(s2->pop(s2)); return p_value; } /*入队,成功返回0, 失败返回-1*/ int enqueue(t_stack *s1, t_stack *s2, int value) { if(!s1 || !s2) return -1; return s1->push(s1, (void *)&value, sizeof(int)); } int main(int argc, char *argv[]) { t_stack *s1, *s2; s1 = init_stack(); if(!s1) return -1; s2 = init_stack(); if(!s2) return -1; printf("空队列出队测试: %s\n", NULL == dequeue(s1, s2) ? "OK" : "NOK"); printf("入队测试,入队值1: %s\n", 0 == enqueue(s1, s2, 1) ? "OK" : "NOK"); printf("入队测试,入队值2: %s\n", 0 == enqueue(s1, s2, 2) ? "OK" : "NOK"); printf("入队测试,入队值3: %s\n", 0 == enqueue(s1, s2, 3) ? "OK" : "NOK"); int *value; value = dequeue(s1, s2); printf("出队测试,期望值1, 实际值%d: %s\n", *value, 1==*value ? "OK" : "NOK"); value = dequeue(s1, s2); printf("出队测试,期望值2, 实际值%d: %s\n", *value, 2==*value ? "OK" : "NOK"); printf("入队测试,入队值4: %s\n", 0 == enqueue(s1, s2, 4) ? "OK" : "NOK"); value = dequeue(s1, s2); printf("出队测试,期望值3, 实际值%d: %s\n", *value, 3==*value ? "OK" : "NOK"); value = dequeue(s1, s2); printf("出队测试,期望值4, 实际值%d: %s\n", *value, 4==*value ? "OK" : "NOK"); s1->destory(&s1); s2->destory(&s2); return 0; }
队列的实现在上一篇文章
相关文章推荐
- C#线程队列用法实例分析
- 算法系列15天速成 第九天 队列
- C++基于栈实现铁轨问题
- C语言单链队列的表示与实现实例详解
- C语言栈的表示与实现实例详解
- C语言实现颠倒栈的方法
- 算法系列15天速成 第十天 栈
- mysql 队列 实现并发读
- C#队列Queue用法实例分析
- C#多线程处理多个队列数据的方法
- C语言循环队列的表示与实现实例详解
- C++循环队列实现模型
- C#内置队列类Queue用法实例
- 一看就懂:图解C#中的值类型、引用类型、栈、堆、ref、out
- Array栈方法和队列方法的特点说明
- C#通过链表实现队列的方法
- java数据结构之java实现栈
- C#队列Queue多线程用法实例
- C#数据结构与算法揭秘五 栈和队列
- JAVA 虚拟机 栈