数据结构(栈--两个队列实现)
来源:互联网 发布:mysql 主键是索引吗 编辑:程序博客网 时间:2024/06/06 01:18
当看到用两个栈实现队列以后,大家有没有兴趣用两个队列实现一个栈呢,呵呵!现在就来介绍用两个队列实现一个栈。
如图
这里介绍队列的常用操作:
l 创建栈
l 销毁栈
l 清空栈
l 压栈
l 出栈
l 返回栈顶元素
l 返回栈的大小
代码总分为三个文件:
QStack.h : 放置功能函数的声明,以及表的声明
QStack.c : 放置功能函数的定义,以及表的定义
Main.c : 主函数,使用功能函数完成各种需求,一般用作测试
整体结构图为:
这里详细说下压栈操作,出栈操作和返回栈顶元素操作:
压栈操作:
- int QStack_Push(QStack* stack, void* item)
- {
- TQStack* aStack = (TQStack*)stack;
- int ret = (NULL!=aStack) && (NULL!=item);
- if(ret)
- {
- if(0 == LinkQueue_Length(aStack->queue_A))
- {
- ret = LinkQueue_Append(aStack->queue_B, item);
- }
- else
- {
- ret = LinkQueue_Append(aStack->queue_A, item);
- }
- }
- return ret;
- }
如图:
出栈操作:
- void* QStack_Pop(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(aStack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Retrieve(aStack->queue_A);
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Retrieve(aStack->queue_B);
- }
- }
- return ret;
- }
如图:返回栈顶元素:
- void* QStack_Top(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(stack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Header(aStack->queue_A);
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Header(aStack->queue_B);
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- }
- return ret;
- }
如图:
OK! 上代码:
QStack.h :
- #ifndef _QSTACK_H_
- #define _QSTACK_H_
- typedef void QStack;
- QStack* QStack_Create();
- void QStack_Destroy(QStack* stack);
- void QStack_Clear(QStack* stack);
- int QStack_Push(QStack* stack, void* item);
- void* QStack_Pop(QStack* stack);
- void* QStack_Top(QStack* stack);
- int QStack_Length(QStack* stack);
- #endif
QStack.c :
- #include <malloc.h>
- #include “LinkQueue.h”
- #include “QStack.h”
- typedef struct _tag_QStack
- {
- LinkQueue* queue_A;
- LinkQueue* queue_B;
- }TQStack;
- QStack* QStack_Create()
- {
- TQStack* ret = (TQStack*)malloc(sizeof(TQStack));
- if(NULL != ret)
- {
- ret->queue_A = LinkQueue_Create();
- ret->queue_B = LinkQueue_Create();
- if((NULL==ret->queue_A) || (NULL==ret->queue_B))
- {
- LinkQueue_Destroy(ret->queue_A);
- LinkQueue_Destroy(ret->queue_B);
- free(ret);
- ret = NULL;
- }
- }
- return ret;
- }
- void QStack_Destroy(QStack* stack)
- {
- QStack_Clear(stack);
- free(stack);
- }
- void QStack_Clear(QStack* stack)
- {
- while(QStack_Length(stack) > 0)
- {
- QStack_Pop(stack);
- }
- }
- int QStack_Push(QStack* stack, void* item)
- {
- TQStack* aStack = (TQStack*)stack;
- int ret = (NULL!=aStack) && (NULL!=item);
- if(ret)
- {
- if(0 == LinkQueue_Length(aStack->queue_A))
- {
- ret = LinkQueue_Append(aStack->queue_B, item);
- }
- else
- {
- ret = LinkQueue_Append(aStack->queue_A, item);
- }
- }
- return ret;
- }
- void* QStack_Pop(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(aStack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Retrieve(aStack->queue_A);
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Retrieve(aStack->queue_B);
- }
- }
- return ret;
- }
- void* QStack_Top(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(stack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Header(aStack->queue_A);
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Header(aStack->queue_B);
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- }
- return ret;
- }
- int QStack_Length(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- int ret = -1;
- if(NULL != aStack)
- {
- ret = LinkQueue_Length(aStack->queue_B) +
- LinkQueue_Length(aStack->queue_A);
- }
- return ret;
- }
Main.c :
- #include <stdio.h>
- #include “QStack.h”
- int main(void)
- {
- QStack* stack = QStack_Create();
- int a[10];
- int i = 0;
- for(i=0; i<10; i++)
- {
- a[i] = i;
- QStack_Push(stack, a+i);
- }
- printf(”Header: %d\n”, *(int*)QStack_Top(stack));
- printf(”Length: %d\n\n”, QStack_Length(stack));
- while(QStack_Length(stack) > 0)
- {
- printf(”Pop: %d\n”, *(int*)QStack_Pop(stack));
- }
- printf(”\n”);
- for(i=0; i<6; i++)
- {
- a[i] = i+10;
- QStack_Push(stack, a+i);
- }
- while(QStack_Length(stack) > 0)
- {
- printf(”Pop: %d\n”, *(int*)QStack_Pop(stack));
- }
- QStack_Destroy(stack);
- return 0;
- }
当看到用两个栈实现队列以后,大家有没有兴趣用两个队列实现一个栈呢,呵呵!现在就来介绍用两个队列实现一个栈。
如图
这里介绍队列的常用操作:
l 创建栈
l 销毁栈
l 清空栈
l 压栈
l 出栈
l 返回栈顶元素
l 返回栈的大小
代码总分为三个文件:
QStack.h : 放置功能函数的声明,以及表的声明
QStack.c : 放置功能函数的定义,以及表的定义
Main.c : 主函数,使用功能函数完成各种需求,一般用作测试
整体结构图为:
这里详细说下压栈操作,出栈操作和返回栈顶元素操作:
压栈操作:
- int QStack_Push(QStack* stack, void* item)
- {
- TQStack* aStack = (TQStack*)stack;
- int ret = (NULL!=aStack) && (NULL!=item);
- if(ret)
- {
- if(0 == LinkQueue_Length(aStack->queue_A))
- {
- ret = LinkQueue_Append(aStack->queue_B, item);
- }
- else
- {
- ret = LinkQueue_Append(aStack->queue_A, item);
- }
- }
- return ret;
- }
如图:
出栈操作:
- void* QStack_Pop(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(aStack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Retrieve(aStack->queue_A);
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Retrieve(aStack->queue_B);
- }
- }
- return ret;
- }
如图:返回栈顶元素:
- void* QStack_Top(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(stack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Header(aStack->queue_A);
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Header(aStack->queue_B);
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- }
- return ret;
- }
如图:
OK! 上代码:
QStack.h :
- #ifndef _QSTACK_H_
- #define _QSTACK_H_
- typedef void QStack;
- QStack* QStack_Create();
- void QStack_Destroy(QStack* stack);
- void QStack_Clear(QStack* stack);
- int QStack_Push(QStack* stack, void* item);
- void* QStack_Pop(QStack* stack);
- void* QStack_Top(QStack* stack);
- int QStack_Length(QStack* stack);
- #endif
QStack.c :
- #include <malloc.h>
- #include “LinkQueue.h”
- #include “QStack.h”
- typedef struct _tag_QStack
- {
- LinkQueue* queue_A;
- LinkQueue* queue_B;
- }TQStack;
- QStack* QStack_Create()
- {
- TQStack* ret = (TQStack*)malloc(sizeof(TQStack));
- if(NULL != ret)
- {
- ret->queue_A = LinkQueue_Create();
- ret->queue_B = LinkQueue_Create();
- if((NULL==ret->queue_A) || (NULL==ret->queue_B))
- {
- LinkQueue_Destroy(ret->queue_A);
- LinkQueue_Destroy(ret->queue_B);
- free(ret);
- ret = NULL;
- }
- }
- return ret;
- }
- void QStack_Destroy(QStack* stack)
- {
- QStack_Clear(stack);
- free(stack);
- }
- void QStack_Clear(QStack* stack)
- {
- while(QStack_Length(stack) > 0)
- {
- QStack_Pop(stack);
- }
- }
- int QStack_Push(QStack* stack, void* item)
- {
- TQStack* aStack = (TQStack*)stack;
- int ret = (NULL!=aStack) && (NULL!=item);
- if(ret)
- {
- if(0 == LinkQueue_Length(aStack->queue_A))
- {
- ret = LinkQueue_Append(aStack->queue_B, item);
- }
- else
- {
- ret = LinkQueue_Append(aStack->queue_A, item);
- }
- }
- return ret;
- }
- void* QStack_Pop(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(aStack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Retrieve(aStack->queue_A);
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Retrieve(aStack->queue_B);
- }
- }
- return ret;
- }
- void* QStack_Top(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- void* ret = NULL;
- if((NULL!=aStack) && (0<QStack_Length(stack)))
- {
- if(0 == LinkQueue_Length(aStack->queue_B))
- {
- while(LinkQueue_Length(aStack->queue_A) > 1)
- {
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- ret = LinkQueue_Header(aStack->queue_A);
- LinkQueue_Append(aStack->queue_B, LinkQueue_Retrieve(aStack->queue_A));
- }
- else
- {
- while(LinkQueue_Length(aStack->queue_B) > 1)
- {
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- ret = LinkQueue_Header(aStack->queue_B);
- LinkQueue_Append(aStack->queue_A, LinkQueue_Retrieve(aStack->queue_B));
- }
- }
- return ret;
- }
- int QStack_Length(QStack* stack)
- {
- TQStack* aStack = (TQStack*)stack;
- int ret = -1;
- if(NULL != aStack)
- {
- ret = LinkQueue_Length(aStack->queue_B) +
- LinkQueue_Length(aStack->queue_A);
- }
- return ret;
- }
Main.c :
- #include <stdio.h>
- #include “QStack.h”
- int main(void)
- {
- QStack* stack = QStack_Create();
- int a[10];
- int i = 0;
- for(i=0; i<10; i++)
- {
- a[i] = i;
- QStack_Push(stack, a+i);
- }
- printf(”Header: %d\n”, *(int*)QStack_Top(stack));
- printf(”Length: %d\n\n”, QStack_Length(stack));
- while(QStack_Length(stack) > 0)
- {
- printf(”Pop: %d\n”, *(int*)QStack_Pop(stack));
- }
- printf(”\n”);
- for(i=0; i<6; i++)
- {
- a[i] = i+10;
- QStack_Push(stack, a+i);
- }
- while(QStack_Length(stack) > 0)
- {
- printf(”Pop: %d\n”, *(int*)QStack_Pop(stack));
- }
- QStack_Destroy(stack);
- return 0;
- }
- 数据结构(24)队列--两个栈实现
- 数据结构(队列--两个栈实现)
- 数据结构(栈--两个队列实现)
- 数据结构(队列--两个栈实现)
- 数据结构(栈--两个队列实现)
- 用两个栈实现队列[数据结构]
- 用两个栈实现队列[数据结构]
- 【数据结构】两个栈实现一个队列
- 数据结构-使用两个栈实现一个队列
- 【数据结构】用两个队列实现一个栈
- 【数据结构】 两个栈实现一个队列【面试】
- 【数据结构】两个队列实现一个栈
- 【数据结构】用两个栈实现队列
- 数据结构--两个栈实现一个队列
- 数据结构--两个队列实现一个栈
- 数据结构之两个栈实现队列
- 【数据结构】队列以及两个队列实现一个栈
- 【数据结构】栈以及两个栈实现一个队列
- myflag step9:新增falg的支持
- HDU1269迷宫城堡连通分量分解
- 2017年第0届浙江工业大学之江学院程序设计竞赛决赛—F
- redis小结
- 关于Java中交换数组中的两个元素的一个错误笔记
- 数据结构(栈--两个队列实现)
- C语言函数strtok
- Thinkphp5使用阿里大于短信验证
- EEE功能及限制
- 树莓派上电自启动某执行程序的实现
- C++11多线程学习小结
- Xshell多窗口执行同一个命令
- 常见的MAC算法(PBOC_3DES_MAC、ANSI X9.9MAC算法、ANSI x9.19算法)
- Neo4j入门