两个栈实现队列的功能。(外部接口是队列)

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

//栈
typedef struct Stack
{
    int date;
    Stack *next;
}Stack;

//队列
typedef struct Queue
{
    Stack *front;
    Stack *tail;
}Que;

//栈的初始化
void Init_stack(Stack **top)
{
    *top= (Stack*)malloc(sizeof(Stack));
    (*top)->next = NULL;
}

//入栈
int push(Stack *top,int date)
{
    Stack *p = (Stack *)malloc(sizeof(Stack));
    if (p == NULL)
    {
        return -1;
    }
    p->date = date;
    p->next = top->next;
    top->next = p;
    return 1;
}

//出栈
int pop(Stack *top,int &date)
{
    Stack *p;
    if (top->next == NULL)
        return -1;
    date = top->next->date;
    p = top->next;
    top->next = p->next;
    free(p);
    return 1;
}

//判断栈是否为空
int empty_Stack(Stack top)
{
    if (top.next == NULL)
        return 1;
    return 0;
}

//查看栈顶的值
int get_Stack(Stack * top,int &date)
{
    if (top->next == NULL)
    {
        date = -1;
        return -1;
    }
    date = top->next->date;
}
//队列初始化
void Init_que(Que *que)
{
    Init_stack(&(que->front));
    Init_stack(&(que->tail));
}

//入队
int enter(Que *que,int date)
{
    push(que->tail,date);
    return 1;
}

//判断队列是否为空
int empty(Que que)
{
    if (que.front->next == NULL&&que.tail->next == NULL)
        return 1;
    else
        return 0;
}

//出队
int delete_que(Que *que,int &date)
{
    if (empty(*que))
    {
        printf("队列为空\n");
        date = -1;
        return -1;
    }
    Que *p = que;
    if (p->front->next != NULL)
    {
        pop(que->front, date);
        return 1;
    }
    while (p->tail->next !=NULL)
    {
        int num = 0;
        pop(p->tail, num);
        push(p->front, num);
    }
    pop(que->front,date);
    return 1;
}

//获得队头的值
int get(Que *que, int &date)
{
    if (empty(*que))
    {
        printf("队列为空\n");
        date = -1;
        return -1;
    }
    Que *p = que;
    if (p->front->next != NULL)
    {
        get_Stack(que->front, date);
        return 1;
    }
    while (p->tail->next != NULL)
    {
        int num = 0;
        pop(p->tail, num);
        push(p->front, num);
    }
    get_Stack(que->front, date);
    return 1;
}



int main(void)
{
    Stack *p;
    Init_stack(&p);
    push(p,10);
    int x = 0;
    pop(p,x);



    Que que;//申请一个队列
    Init_que(&que);
    enter(&que,10);
    enter(&que, 20);

    int date = 0;

    get(&que,date);
    printf("获得队头的值%d\n",date);

    delete_que(&que,date);
    printf("出队的值为%d\n",date);


    enter(&que, 30);
    enter(&que, 40);

    get(&que, date);
    printf("获得队头的值%d\n", date);

    delete_que(&que, date);
    printf("出队的值为%d\n", date);

    get(&que, date);    
    printf("获得队头的值%d\n", date);

    printf("判断是否为空%d\n",empty(que));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值