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

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

结点结构体: 

typedef struct node 

{

 int data; 

node *next; 

}node,*LinkStack;

创建空栈:

 LinkStack CreateNULLStack( LinkStack &S) 

S = (LinkStack)malloc( sizeof( node ) ); //申请新结点 ,带头结点

if( NULL == S) 

printf("Fail to malloc a new node.\n");

return NULL;

 } 

S->data = 0; //初始化新结点 

S->next = NULL; 

return S; 

}

栈的插入函数:设计的是一个带头结点的栈,插入和删除操作都在头结点后

 LinkStack Push( LinkStack &S, int data)

 {

 if( NULL == S) //检验栈 

printf("There no node in stack!"); 

return NULL;

 } 

LinkStack p = NULL; 

p = (LinkStack)malloc( sizeof( node ) ); //申请新结点 

if( NULL == p)

printf("Fail to malloc a new node.\n"); 

return S;

 } 

if( NULL == S->next) 

p->next = NULL; 

else

 { 

p->next = S->next; 

p->data = data; //初始化新结点 

S->next = p; //插入新结点 

return S; 

}

出栈函数:

 node Pop( LinkStack &S)

 { 

node temp; 

temp.data = 0; 

temp.next = NULL;

 if( NULL == S) //检验栈

 {

 printf("There no node in stack!"); 

return temp;

 } 

temp = *S;

if( S->next == NULL ) 

printf("The stack is NULL,can't pop!\n"); 

return temp; 

LinkStack p = S ->next; //节点出栈 

S->next = S->next->next; 

temp = *p; 

free( p ); 

p = NULL; 

return temp;

 }

双栈实现队列的入队函数:

 LinkStack StackToQueuPush( LinkStack &S, int data)

 { 

node n;

 LinkStack S1 = NULL; 

CreateNULLStack( S1 ); //创建空栈 

while( NULL != S->next ) //S出栈入S1 

n = Pop( S ); 

Push( S1, n.data ); 

Push( S1, data ); //新结点入栈 

while( NULL != S1->next ) //S1出栈入S

 { 

n = Pop( S1 ); 

Push( S, n.data ); 

return S; 

}

说明:用两个栈能够实现一个队列的功能,那用两个队列能否实现一个队列的功能呢?结果是否定的,因为栈是先进后出,将两个栈连在一起,就是先进先出。而队列是现先进先出,无论多少个连在一起都是先进先出,而无法实现先进后出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值