现在的位置: 首页 > 综合 > 正文

用两个栈实现一个队列功能

2018年02月09日 ⁄ 综合 ⁄ 共 2523字 ⁄ 字号 评论关闭

两个栈 设为StackIn和StackOut

1.StackIn实现队列入队功能

压栈进入A

push(A)

2.StackOut实现队列出队功能

如果B栈为空,A弹栈,压入B中,B弹栈 

如果B栈不为空,直接弹栈B

 

/*

 * 用两个栈实现队列

 */

#include<stdio.h>

#include<stdlib.h>

typedef struct stack

{

 //用来保存元素

 int *a;

 //当前的下标

 int loc;

 //栈中最多可以容纳的元素个数

 int max;

}st;

/*

 * 初始化指定大小的栈

 */

st *initstack(int num)

{

 st *s=(st *)malloc(sizeof(st));

 if(s==NULL)

 {

  printf("create fail!\n");

  exit(1);

 }

 s->loc=0;

 s->max=num;

 s->a=(int *)malloc(sizeof(int)*num);

 if(s->a==NULL)

 {

  printf("create fail!\n");

  exit(1);

 }

 return s;

}

/*

 * 判断栈是否为空(空:返回1 非空:返回0)

 */

int isstackempty(st *s)

{

 //栈为空

 if(s->loc==0)return 1;

 else return 0;

}

/*

 * 判断栈是否为满(满:返回1 非满:返回0)

 */

int isstackfull(st *s)

{

 //栈为满

 if(s->loc==s->max)return 1;

 else return 0;

}

/*

 * 栈中元素个数

 */

int getstacknum(st *s)

{

 if(isstackempty(s)==1)return 0;

 else return s->loc;

}

/*

 * 入栈

 */

void pushstack(st *s,int value)

{

 //栈满,无法入栈

 if(isstackfull(s)==1)

 {

  printf("栈已满,无法入栈!\n");

  exit(1);

 }

 s->a[s->loc]=value;

 s->loc++;

}

/*

 * 出栈

 */

int popstack(st *s)

{

 if(isstackempty(s)==1)

 {

  printf("栈为空,无法出栈!\n");

  exit(1);

 }

 int temp=s->a[s->loc-1];

 s->loc--;

 return temp;

}

/*

 * 查看栈顶元素

 */

int peekstack(st *s)

{

 if(isstackempty(s)==1)

 {

  printf("栈为空,无法查看栈顶元素!\n");

  exit(1);

 }

 int temp=s->a[s->loc-1];

 return temp;

}

/*

 * 将一个栈中的元素拷贝到另一栈中

 */

void copy(st *src,st *dest)

{

 //拷贝过程中发生溢出

 if((src->loc+dest->loc)>dest->max)

 {

  printf("拷贝过程中发生溢出!\n");

  exit(1);

 }

 while(isstackempty(src)!=1)

 {

  int value=popstack(src);

  pushstack(dest,value);

 }

}

/*

 * 打印栈中的各个元素

 */

void printstack(st *s)

{

 if(isstackempty(s)==1)

 {

  printf("栈为空,无法打印栈中各个元素!\n");

  exit(1);

 }

 while(isstackempty(s)!=1)

 {

  int value=popstack(s);

  printf("%d--->",value);

 }

}

/*

 * 入队列(入队列的元素保存在src中)

 */

void pushqueue(st *src,st *dest,int value)

{

 if(src->loc==src->max)

 {

  printf("队列已满,无法入队!\n");

  exit(1);

 }

 src->a[src->loc]=value;

 src->loc++;

}

/*

 * 出队列

 * (如果dest不为空,则直接从dest弹出一个元素)

 * (如果dest为空,src不为空,则先将src中的元素拷贝到dest中,在从dest中弹出一个元素)

 */

int popqueue(st *src,st *dest)

{

 if(isstackempty(src)==1&&isstackempty(dest)==1)

 {

  printf("队列为空,无法出队!\n");

  exit(1);

 }

 if(isstackempty(dest)!=1)

 {

  int value=popstack(dest);

  return value;

 }

 else if(isstackempty(dest)==1&&isstackempty(src)!=1)

 {

  copy(src,dest);

  int value=popstack(dest);

  return value;

 }

}

int main()

{

 int num=3;

 int value=0;

 st *src=initstack(num);

 st *dest=initstack(num);

 pushstack(src,1);

 pushstack(src,2);

 value=popqueue(src,dest);

 printf("弹出的元素=%d\n",value);

 pushstack(src,3);

 pushstack(src,4);

 pushstack(src,5);

 value=popqueue(src,dest);

 printf("弹出的元素=%d\n",value);

 value=popqueue(src,dest);

 printf("弹出的元素=%d\n",value);

 value=popqueue(src,dest);

 printf("弹出的元素=%d\n",value);

 value=popqueue(src,dest);

 printf("弹出的元素=%d\n",value);

 return 0;

}

抱歉!评论已关闭.