c语言俩个栈实现一个队列

思路,现在设有俩个栈s1,s2。完成一个队列。

     入队时,数据进入栈s1。出队时检查s2栈是否为空,为空则将s1出栈,出栈数据依次入栈s2。完成一个s1全部出栈后,s2出栈既是此时的出队操作。如果s2不为空,那s2直接出栈。如果s2,s1都为空,此时队列为空,无法执行出队操作。代码如下。

/**
  *@filename seqstack.c
  *@author   haohaibo
  *@data     2017/4/15
  *@brief	 俩个栈实现一个队列
 */

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

#define N 100

typedef int	datatype_t;
typedef struct {
	datatype_t data[N];
	datatype_t top;	
}seqstack_t; 

typedef struct stackqueue_p{
	seqstack_t *front;
	seqstack_t *real;
	int count;
}sq_t;

/**
  *@brief 创建一个空的栈
 */
seqstack_t *seqstack_creat()
{
	seqstack_t *s;
	s=(seqstack_t *)malloc(sizeof(seqstack_t));
	if(NULL==s)
	{
		printf(__FUNCTION__);
		printf("ERROR in line %d",__LINE__);
		return (seqstack_t *)-1;
	}
	bzero(s,sizeof(seqstack_t));
	s->top=-1;
} 

/**
  *@brief 清空栈
 */
void seqstack_clear(seqstack_t *s)
{
	s->top=-1;
}

/**
  *@brief 栈满
 */
datatype_t seqstack_full(seqstack_t *s)
{

	if(s->top>=N-1)
	{
		printf("static full!");
		return (datatype_t)1;
	}
	else
	return (datatype_t)0;
}

/**
  *@brief 栈空
 */
datatype_t seqstack_empty(seqstack_t *s)
{
	if(s->top==-1)
	{
		printf("static empty!");
		return (datatype_t)1;
	}
	else
	return (datatype_t)0;
}

/**
  *@brief 入栈
 */
datatype_t seqstack_insert(seqstack_t *s,datatype_t value)
{
	if(seqstack_full(s))
	return (datatype_t)-1;
	s->top++;
	s->data[s->top]=value;
	return (datatype_t)0;
}

/**
  *@brief 出栈
 */
datatype_t seqstack_out(seqstack_t *s)
{
	datatype_t value=s->data[s->top];
	if(seqstack_empty(s))
	return (datatype_t)-1;
	s->top--;
	return value;
}

/**
  *@brief 打印栈数据
 */
datatype_t seqstack_show(seqstack_t *s)
{
	datatype_t i;
	if(seqstack_empty(s))
	return (datatype_t)-1;
	for(i=0;i<=s->top;i++)
	printf("top %d=%d.\n",i,s->data[i]);
	return (datatype_t)0;
}

/**
  *@brief 创建一个空栈队列
 */
sq_t *stackqueue_create()
{
	sq_t *sq=(sq_t *)malloc(sizeof(sq_t));
	sq->front=seqstack_creat();
	sq->real=seqstack_creat();
	if(NULL==sq)
	{
		printf(__FUNCTION__);
		printf("error in line %d.\n",__LINE__);
		return (sq_t*)-1;
	}
	//sq->front->top=sq->real->top=-1;
	return sq;
}

/**
  *@brief 入队
 */
int push(sq_t *sq,int value)
{
	seqstack_insert(sq->real,value);
	return 0;

}

/**
  *@brief 出队
 */
datatype_t pop(sq_t *sq)
{
	
	if(seqstack_empty(sq->real));
	{
		while(seqstack_empty(sq->real))
		{
			seqstack_insert(sq->front,seqstack_out(sq->real));
		}
	}
	return seqstack_out(sq->front);
}

/**
  *@brief 打印队列
 */
void stackqueue_show(sq_t *sq)
{
	seqstack_show(sq->front);
	seqstack_show(sq->real);
}


int main(void)
{
	sq_t *p=stackqueue_create();
	push(p,1);
	push(p,2);
	push(p,3);
	pop(p);
	stackqueue_show(p);
}

















  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值