首页 > 代码库 > 【剑指offer】用两个栈实现队列
【剑指offer】用两个栈实现队列
题目:用两个栈实现一个队列。队列的声明如下:请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
分析:
队列的特点是“先进先出”,而栈的特点是“先进后出”。要用两个栈来实现队列。用图分析如下:
程序代码如下:
#include <stdio.h> #include <stdlib.h> #include <memory.h> #ifndef ERROR #define ERROR (0) #endif #ifndef OK #define OK (!ERROR) #endif #define STACK_INIT_SIZE 1 #define STACKINCREMENT 10 typedef int SElemType; typedef struct SqStack{ SElemType *base; SElemType *top; int stacksize; }SqStack, *pStack; pStack S1, S2; pStack InitStack(pStack S); pStack Push(pStack S, SElemType e); SElemType Pop(pStack S); void QueueInput(int number); int QueueOutput(); int main(void) { S1 = InitStack(S1); S2 = InitStack(S2); QueueInput(3); QueueInput(8); QueueInput(5); printf("output is %d\n",QueueOutput()); return 0; } pStack InitStack(pStack S) { S = (pStack)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(S == NULL){ return ERROR; } S->base = (SElemType *)S; S->top = S->base; S->stacksize = STACK_INIT_SIZE; return S; } pStack Push(pStack S, SElemType e) { if((S->top - S->base) >= S->stacksize){ S->base = (SElemType *)realloc(S, (S->stacksize + STACKINCREMENT)*sizeof(SElemType)); if(S->base == NULL) return ERROR; S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } *S->top++ = e; return S; } SElemType Pop(pStack S) { if(S->top == S->base) return 0; return *(--S->top); } void QueueInput(int number) { Push(S1, number); } int QueueOutput() { Push(S2,Pop(S1)); Push(S2,Pop(S1)); Push(S2,Pop(S1)); return Pop(S2); }
注意:上面的代码只是简单的实现了两个栈实现队列的功能,但没有普适性,而且只是一个交互性几乎没有。
总结:
1、了解栈以及队列的特点。
2、注意画图对分析程序的帮助。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。