用两个栈实现队列

【题目】

用两个栈实现一个队列,分别完成在队列尾部插入结点和在队列头部删除结点的功能。


【分析】

假设两个栈,栈1和栈2,来实现队列,栈1用来入队,栈2用来出队。
入队时,将元素全部压入栈1;
出队时,如果栈2不为空,就直接pop栈2,否则,就将栈1的所有元素pop到栈1里,再把栈2栈顶弹出。
这里写图片描述


由图所示,abcdef依次入队,压栈,出队时先将元素从s1弹出,压入s2,从s2出栈实现出队,即使后面再有元素入队,也是先压入s1,出队永远用s2。

【测试代码】

#include<stdio.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0
#define MAX 10

typedef int my_data;
typedef int Stack_data;
typedef struct StackNode
{
    Stack_data data;
    struct StackNode *next;
}my_stack, * my_stack_ptr;

typedef struct LinkStack
{
    my_stack_ptr top;//栈顶是一个指针
    int count;
}LinkStack;

void init(LinkStack *s)
{
    my_stack_ptr first = (my_stack_ptr)malloc(sizeof(my_stack));
    first->next = NULL;
    s->top = first;
    s->count = 0;
}

int stack_empty( LinkStack s )
{
    if(s.top->next ==NULL)
        return OK;
    else
        return ERROR;
}

int push(LinkStack *s, my_data e)
{
    my_stack_ptr pnew = (my_stack_ptr )malloc(sizeof(my_stack ));
    pnew ->data = e;
    pnew-> next = s ->top;
    s->top = pnew;
    s->count++;

    return OK;
}

int pop(LinkStack *s ,  my_data *e)
{
    my_stack_ptr p;
    if(stack_empty(*s))
        return ERROR;
    *e = s->top->data;
    p = s->top;
    s->top = s->top->next;
    free(p);
    s->count --;
    return OK;
}

void enqueue(LinkStack *s1, LinkStack *s2, my_data e)
{
    push(s1,  e);
}
void dequeue(LinkStack *s1, LinkStack *s2, my_data *e)
{
    if(stack_empty( *s2 )==1)//如果s2空
    {
        while(stack_empty(*s1 ) == 0)//s1不空
        {
            pop(s1,e);
            push(s2, *e);
        }
    }
    pop(s2,e);
}

void test(LinkStack *s1, LinkStack *s2, my_data *e)
{
    int d[] = {1,2,3,4,5,6,7,8};
    int length = 8;

    printf("进栈顺序:\n");
    for(int i =0 ; i<length; i++)
    {
        printf("%d",d[i]);
        enqueue(s1,s2, d[i]);
    }
    printf("\n");

    printf("出栈顺序:\n");
    while(length--)
    {
        dequeue(s1,s2,e);
        printf("%d",*e);
    }
    printf("\n");
}

void main()
{
    LinkStack *s1= (LinkStack *)malloc(sizeof(LinkStack));
    LinkStack *s2= (LinkStack *)malloc(sizeof(LinkStack));
    init(s1);
    init(s2);
    my_data *e = (my_data *)malloc(sizeof(my_data));
    test(s1,s2,e);
}

【输出】
这里写图片描述
【参考】
http://www.cnblogs.com/kaituorensheng/archive/2013/03/02/2939690.html
个人觉得此博客讲的比较清晰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值