用两个栈实现一个队列的功能
#include "stdafx.h"
//#include <stdio.h>
//#include <iostream>
//#include <stdlib.h>
//#include <stdio.h>
#include <malloc.h>
//using namespace std;
//using namespace std;
using namespace std;
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("Failed 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 StackToQueuePush(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;
}
//创建一个空队列函数
void main(void)
{
node n;
LinkStack S1 = NULL;
CreateNULLStack(S1);
for(int i = 0;i<8;i++) //入队列式栈
{
StackToQueuePush(S1 , i);
printf(" %d",i);
}
printf("\n");
while(NULL != S1->next) //出队列式栈
{
n = Pop(S1);
printf("%d", n.data);
}
printf("\n");
}