c语言编程队列题,[原创]C语言面试题 两个栈实现一个队列

思路: 栈是先入后出,所以我们可以考虑把栈一的数据从栈顶把数据压到另一个缓冲栈栈里。然后缓冲栈依次出栈,就实现了先入先出的逻辑,然后再把数据压回去。

#include

#include

#include

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int size=0;

typedef struct no

{

int data;

struct no *pnext; //构造链表

struct no *ppre;

}node;

typedef struct

{

node head; //构造链表头和链表尾

node tail;

}lht;

void link_show(const lht *p)

{ node *pn=(node*)p->head.pnext;

while(pn!=&p->tail)

{

printf("%d ",pn->data); //遍历显示链表

pn=pn->pnext;

}

printf("\n");

}

void link_init(lht *p)

{

p->head.pnext=&p->tail;

p->head.ppre=NULL;

p->tail.pnext=NULL; //初始化链表

p->tail.ppre=&p->head;

}

void link_deinit(lht *p)

{

node *pf=NULL,*pm=NULL,*pl=NULL;

while(p->head.pnext!=&p->tail)

{

pf=&p->head;

pm=pf->pnext;

pl=pm->pnext; //清空链表

pf->pnext=pm->pnext;

pl->ppre=pf;

free(pm);

pm=NULL;

}

}

int link_empty(lht **p)

{

if((*p)->head.pnext==&(*p)->tail) //判断空链表

return 1;

return 0;

}

int link_add(lht *p,int i)

{

node *pf=NULL,*pm=NULL,*pl=NULL,*pn=NULL; //进栈

pn=(node*)malloc(sizeof(node));

if(pn==NULL)

return 0;

pf=&p->head;

pm=pf->pnext;

pl=pm->pnext;

pf->pnext=pn;

pn->pnext=pm;

pn->ppre=pf;

pm->ppre=pn;

pn->data=i;

return 1;

}

int link_sub(lht *p) //出栈

{

node *pf=NULL,*pm=NULL,*pl=NULL,*pn=NULL;

pf=&p->head;

pm=pf->pnext;

pl=pm->pnext;

pf->pnext=pm->pnext;

pl->ppre=pm->ppre;

free(pm);

pm=NULL;

}

void link_pop(lht *p) //出队列

{

if(link_empty((lht **)&p)) //判断队列是否为空

return;

node *pf=NULL,*pm=NULL,*pl=NULL;;

lht l1={0};

link_init(&l1); //初始化缓冲栈

pf=&p->head;

pm=pf->pnext;

pl=pm->pnext;

while(pl!=NULL)

{

link_add(&l1,pm->data); //把栈里的数据压进缓冲栈并清空栈1

pf->pnext=pm->pnext;

pl->ppre=pm->ppre;

free(pm);

pm=NULL;

pm=pf->pnext;

pl=pm->pnext;

}

link_sub(&l1); //弹出缓冲栈的第一个节点,相当于先入先出

pf=&l1.head;

pm=pf->pnext;

pl=pm->pnext;

node *pf1=NULL,*pm1=NULL,*pl1=NULL,*pn=NULL;

pf1=&p->head;

while(pm!=&l1.tail)//把数据压从缓冲栈回栈1

{

pn=(node*)malloc(sizeof(node));

if(pn==NULL)

return;

pm1=pf1->pnext;

pf1->pnext=pn;

pn->pnext=pm1;

pn->ppre=pf1;

pm1->ppre=pn;

pn->data=pm->data;

pm=pm->pnext;

}

link_deinit(&l1);

}

int main(int argc, char *argv[]) {

lht l1={0};

link_init(&l1);

link_add(&l1,1);

link_add(&l1,2);

link_add(&l1,3);

link_add(&l1,4);

link_add(&l1,5);

link_add(&l1,6);

link_pop(&l1);

link_show(&l1);

return 0;

}

1ecfb484769a9fad500b7b713a4801cb.png

上传的附件:

两个栈实现一个队列.png

(94.12kb,0次下载)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值