用两个栈实现队列
来源:互联网 发布:vb.net do while 编辑:程序博客网 时间:2024/05/16 11:42
原理:
由于栈是先进后出的,所以,让数据先进入一个栈中,然后依次从栈顶弹出,在依次进入另一个栈中,最后,从另一个栈中弹出,并输出,这样就变为先进先出了,实现了我们的队列
实现代码
//linklist.h
#ifndef __LINKLIST_H__#define __LINKLIST_H__typedef struct linklistnode { struct linklistnode *next; int item; //自身的一些数据和其他的数据}LinkListNode;typedef struct linklist { LinkListNode header; int length;}LinkList;LinkList *LinkList_Create();void LinkList_Destroy(LinkList *list);void LinkList_Clear(LinkList *list);int LinkList_Length(LinkList *list);int LinkList_Insert(LinkList *list, LinkListNode *node, int pos);LinkListNode *LinkList_Get(LinkList *list, int pos);LinkListNode *LinkList_Delete(LinkList *list, int pos);#endif //__LINKLIST_H__
//linklist.c
#include <stdlib.h>#include "linklist.h"LinkList *LinkList_Create(){ LinkList *ret = NULL; ret = malloc(sizeof(LinkList)); if ( ret != NULL ) { ret->length = 0; ret->header.next = NULL; } return ret;}void LinkList_Destroy(LinkList *list){ free(list);}void LinkList_Clear(LinkList *list){ if ( list != NULL ) { list->length = 0; list->header.next = NULL; }}int LinkList_Length(LinkList *list){ int ret = -1; if ( list != NULL ) { ret = list->length; } return ret;}int LinkList_Insert(LinkList *list, LinkListNode *node, int pos){ int ret = list!=NULL && node!=NULL && pos>=0; if ( ret ) { int i; LinkListNode *cur = (LinkListNode*)list; for (i=0; i<pos && cur->next!=NULL; i++) { cur = cur->next; } node->next = cur->next; cur->next = node; list->length++; } return ret;}LinkListNode *LinkList_Get(LinkList *list, int pos){ LinkListNode *ret = NULL; if ( list!=NULL && (0<=pos && pos<list->length) ) { int i; LinkListNode *cur = (LinkListNode*)list; for (i=0; i<pos; i++) cur = cur->next; ret = cur->next; } return ret;}LinkListNode *LinkList_Delete(LinkList *list, int pos){ LinkListNode *ret = NULL; if ( list!=NULL && (0<=pos&&pos<list->length) ) { int i; LinkListNode *cur = (LinkListNode*)list; for (i=0; i<pos; i++) cur = cur->next; ret = cur->next; cur->next = ret->next; list->length--; } return ret;}
//linkstack.h
#ifndef __LINKSTACK_H__#define __LINKSTACK_H__typedef struct linkstacknode { struct linkstacknode *next; void *item;}LinkStackNode;typedef void LinkStack;LinkStack *LinkStack_Create();void LinkStack_Destroy(LinkStack *stack);void LinkStack_Clear(LinkStack *stack);int LinkStack_Push(LinkStack *stack, void *item);void *LinkStack_Pop(LinkStack *stack);void *LinkStack_Top(LinkStack *stack);int LinkStack_Size(LinkStack *stack);#endif //__LINKSTACK_H__
//linkstack.c
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "linkstack.h"#include "linklist.h"LinkStack *LinkStack_Create(){ return LinkList_Create();}void LinkStack_Destroy(LinkStack *stack){ LinkStack_Clear(stack); LinkList_Destroy(stack);}void LinkStack_Clear(LinkStack *stack){ while ( LinkStack_Size(stack) > 0 ) LinkStack_Pop(stack);}int LinkStack_Push(LinkStack *stack, void *item){ LinkStackNode *node = malloc(sizeof(LinkStackNode)); int ret = stack!=NULL && item!=NULL && node!=NULL; if ( ret ) { memset(node, 0x00, sizeof(*node)); node->item = item; ret = LinkList_Insert(stack, (LinkListNode*)node, 0); } if ( !ret ) { free(node); } return ret;}void *LinkStack_Pop(LinkStack *stack){ LinkStackNode *node = NULL; void *ret = NULL; node = (LinkStackNode*)LinkList_Delete(stack, 0);//返回要删除的节点,给node if ( node != NULL ) { ret = node->item; free(node); } return ret;}void *LinkStack_Top(LinkStack *stack){ LinkStackNode *node= NULL; void *ret = NULL; node = (LinkStackNode*)LinkList_Get(stack, 0); if ( node != NULL ) { ret = node->item; } return ret;}int LinkStack_Size(LinkStack *stack){ return LinkList_Length(stack);}
//squeue.h
#ifndef __SQUEUE_H__#define __SQUEUE_H__#include "linkstack.h"typedef struct squeue{ LinkStack *inStack; //进数据的栈 LinkStack *outStack; //出数据的栈}SQueue;SQueue *SQueue_Create();void SQueue_Destroy(SQueue *queue);void SQueue_Clear(SQueue *queue);int SQueue_Append(SQueue *queue, void *item);void *SQueue_Retrieve(SQueue *queue);void *SQueue_Header(SQueue *queue);int SQueue_Length(SQueue *queue);#endif //__SQUEUE_H__
//squeue.c
#include <stdio.h>#include <stdlib.h>#include "linkstack.h"#include "squeue.h"SQueue *SQueue_Create(){ SQueue *ret = malloc(sizeof(SQueue)); if( ret!=NULL ) { ret->inStack = LinkStack_Create(); ret->outStack = LinkStack_Create();//只要有一个栈创建失败了,那么我们就应该把我们创建的栈给销毁掉 if( ret->inStack==NULL || ret->outStack==NULL ) { LinkStack_Destroy(ret->inStack); LinkStack_Destroy(ret->outStack); free(ret); ret = NULL; } } return ret;}void SQueue_Destroy(SQueue *queue){ SQueue_Clear(queue); free(queue);}void SQueue_Clear(SQueue *queue){ if( queue!=NULL ) { LinkStack_Clear(queue->inStack); LinkStack_Clear(queue->outStack); }}//入队int SQueue_Append(SQueue *queue, void *item){ int ret = queue!=NULL; if( ret ) { ret = LinkStack_Push(queue->inStack, item); } return ret;}//出队void *SQueue_Retrieve(SQueue *queue){ void *ret = NULL; if( queue != NULL ) { if( LinkStack_Size(queue->outStack) == 0 ) //out为空的时候 { while ( LinkStack_Size(queue->inStack) > 0 )//同时in不为空,那么 { LinkStack_Push(queue->outStack, LinkStack_Pop(queue->inStack)); //从in里面弹出,并进入out里面 } } ret = LinkStack_Pop(queue->outStack); //out不为空的时候,直接让它弹出 } return ret;}//队头void *SQueue_Header(SQueue *queue){ void *ret = NULL; if( queue != NULL ) { if( LinkStack_Size(queue->outStack) == 0 ) //out为空的时候 { while ( LinkStack_Size(queue->inStack) > 0 )//同时in不为空,那么 { LinkStack_Push(queue->outStack, LinkStack_Pop(queue->inStack)); //从in里面弹出,并进入out里面 } } ret = LinkStack_Top(queue->outStack); //out不为空的时候,直接让Top取出 } return ret;}//求长度int SQueue_Length(SQueue *queue){ int ret = -1; if( queue != NULL ) { ret = LinkStack_Size(queue->inStack) + LinkStack_Size(queue->outStack); } return ret;}
//main.c
#include <stdio.h>#include <stdlib.h>#include "squeue.h"int main( void ){ SQueue *queue = SQueue_Create(); int i; int a[5] = {11,22,33,44,55}; for(i=0; i<5; i++) { SQueue_Append(queue, a+i); } //SQueue_Append(queue, a); while ( SQueue_Length(queue) > 0 ) { printf("%d ",*(int *)SQueue_Retrieve(queue)); } printf("\n"); SQueue_Destroy(queue); return 0;}
//Makefile
.PHONY : main cleanCC=gcc -gmain: main.o linklist.o linkstack.o squeue.o $(CC) $^ -o $@clean: rm -rf *.o main
0 0
- 用两个栈实现队列 & 用两个队列实现栈
- 用两个队列实现栈&用两个栈实现队列
- 用两个栈实现队列 & 两个队列实现一个栈
- 两个栈实现队列&&用两个队列实现一个栈
- 用两个栈实现队列 & 两个队列实现栈
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个队列实现栈
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个队列实现栈
- 用两个栈实现队列
- 用两个队列实现栈
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个栈实现队列
- 我也谈谈封装 Encapsulation
- 小程序员都来看看吧
- [c]hdoj 1174 高数题
- 【unity优化一】性能检测工具
- thinkpad e430热键显示条不显示
- 用两个栈实现队列
- samba & nfs
- 推荐一些不错的计算机书籍。
- extern可以声明一个变量而不定义它,extern可以声明一个类吗?
- [python]findall函数讲解
- 小紫书 习题2-5 分数化小数(decimal)
- MySQL 中事务详解
- O-C相关-03:面向对象概念的具体介绍
- 【unity优化二】零碎经验集合