设为首页 加入收藏

TOP

用两个栈实现队列的源代码
2014-11-23 23:40:03 来源: 作者: 【 】 浏览:8
Tags:两个 实现 队列 源代码

/*

* 用两个栈实现队列

*/

#include

#include

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;

}

摘自:johnny710vip的专栏

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇一步一步写算法(之图结构) 下一篇整数点与Pick定理

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: