能否用两个栈实现一个队列的功能
2016-06-14 15:13
453 查看
能否用两个栈实现一个队列的功能
结点结构体:
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;
}
说明:用两个栈能够实现一个队列的功能,那用两个队列能否实现一个队列的功能呢?结果是否定的,因为栈是先进后出,将两个栈连在一起,就是先进先出。而队列是现先进先出,无论多少个连在一起都是先进先出,而无法实现先进后出。
结点结构体:
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;
}
说明:用两个栈能够实现一个队列的功能,那用两个队列能否实现一个队列的功能呢?结果是否定的,因为栈是先进后出,将两个栈连在一起,就是先进先出。而队列是现先进先出,无论多少个连在一起都是先进先出,而无法实现先进后出。
相关文章推荐
- TPL异步并行编程之取消任务
- 【电脑知识】:如何设置桌面存储路径
- (OK) Android 6.0 (Marshmallow) Install apk - INSTALL_FAILED_INVALID_URI
- BZOJ3065 带插入区间K小值
- Adapter中的getView()方法只走了两遍
- Android 屏幕适配的一种方案
- 用PDB库调试Python程序
- something
- Android语音识别开发详解(基于讯飞语音SDK)
- php如何实现文件下载
- 获取exr图片上像素点的颜色通道
- RGB888转RGB666
- ccah-500 第22题 Which process instantiates user code, and executes map and reduce tasks on a cluster r
- 【FragmentTabHost】FragmentTabHost的使用
- 菜鸟进阶01-html/css
- WebBrowser 遇到类似银行网页需要安装插件才显示的文本框问题
- 图解ByteBuffer
- 好好了解一下Cookie(强烈推荐)
- HTML判断判断客户端是IOS还是Android
- T-SQL Part VIII: CROSS APPLY, OUTER APPLY