首页
社区
课程
招聘
[原创]C语言面试题 两个栈实现一个队列
发表于: 2019-11-2 13:51 4279

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

2019-11-2 13:51
4279

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

#include <iostream>
#include<stdio.h>
#include<stdlib.h> 
/* 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;
}

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 2
支持
分享
最新回复 (9)
雪    币: 2460
活跃值: (2954)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
灵魂图示
2019-11-2 13:52
0
雪    币: 2063
活跃值: (1752)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
作图太有灵魂
2019-11-2 16:34
0
雪    币: 43
活跃值: (1084)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
davidangle 作图太有灵魂
.......
2019-11-2 22:48
0
雪    币: 8358
活跃值: (4961)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
那个公司的面试题
2019-11-3 02:09
0
雪    币: 6049
活跃值: (4717)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
6
严重怀疑你的正当职业是医生.
2019-11-3 06:08
0
雪    币: 43
活跃值: (1084)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
淡然他徒弟 严重怀疑你的正当职业是医生.
what? 我大二。。。
2019-11-3 14:03
0
雪    币: 43
活跃值: (1084)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
大道在我 那个公司的面试题
《剑指offer》里的题目
2019-11-3 14:05
0
雪    币: 6049
活跃值: (4717)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
9
AMask what? 我大二。。。
因为你画的图 跟医生写的药单差不多...
2019-11-3 16:03
0
雪    币: 43
活跃值: (1084)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
淡然他徒弟 因为你画的图 跟医生写的药单差不多...
这是我老师画的,他用java写代码  可我讨厌java。。。一节课就学了一张图。。。
2019-11-4 01:56
0
游客
登录 | 注册 方可回帖
返回
//