码迷,mamicode.com
首页 > 其他好文 > 详细

用两个栈实现队列

时间:2015-05-27 10:23:41      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:栈-队列   c   

【题目】

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


【分析】

假设两个栈,栈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
个人觉得此博客讲的比较清晰

用两个栈实现队列

标签:栈-队列   c   

原文地址:http://blog.csdn.net/xinyu913/article/details/46013607

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!