思想和上一篇文章"2个顺序栈实现顺序队功能"一样,代码如下:
// 2ChainStack_ChainQueue.cpp : 定义控制台应用程序的入口点。
//两个链栈实现一个链队功能
#include "stdafx.h"
#include <iostream>
typedef int type;
using namespace std;
//链栈结点
typedef struct stack
{
type data;
struct stack *next;
}stack,*pStack;
//初始化链栈
pStack InitStack(pStack s)
{
s=(pStack)malloc(sizeof(stack)); //相当于链表的头结点
if(NULL==s)
{
exit(-1);
}
s->next=NULL;
return s;
}
//入栈操作
void Push(pStack s,type data)
{
pStack newNode=(pStack)malloc(sizeof(stack));
if(NULL==newNode)
{
cout<<"申请内存失败!"<<endl;
exit(-1);
}
newNode->data=data;
newNode->next=s->next;
s->next=newNode;
}
//出栈
pStack Pop(pStack s)
{
if(NULL==s->next)
{
cout<<"空栈!"<<endl;
exit(-1);
}
pStack temp=s->next;
s->next=temp->next;
return temp;
}
//栈的长度
int LengthStack(pStack s)
{
pStack temp=s->next;
int i=0;
while(NULL!=temp)
{
i++;
temp=temp->next;
}
return i;
}
//入队
void EnterQueue(pStack s1,type data)
{
Push(s1,data);//将元素压入栈s1
}
//出队
pStack DelQueue(pStack s1,pStack s2)
{
while(NULL!=s1->next) //将栈s1中的元素压入s2 s1清空
{
Push(s2,s1->next->data);
s1->next=s1->next->next;
}
pStack temp=Pop(s2); //s2栈顶元素出栈 即为队首元素出队
while(NULL!=s2->next) //将栈s2中余下的元素压入s1 s2清空
{
Push(s1,s2->next->data);
s2->next=s2->next->next;
}
return temp;
}
//打印队列
void PrintQueue(pStack s1)
{
if(NULL==s1->next)
{
exit(-1);
}
int len=LengthStack(s1);
int i=0;
type *tp;
tp=new type[len];
pStack p=s1->next;
while(NULL!=p) //找到队首指针
{ tp[i++]=p->data;
p=p->next;
}
for(int j=len-1;j>=0;j--)
cout<<tp[j]<<" ";
cout<<endl;
delete []tp;
}
int _tmain(int argc, _TCHAR* argv[])
{
type a[5]={1,2,3,4,5};
pStack s1=NULL;
pStack s2=NULL;
s1=InitStack(s1);
s2=InitStack(s2);
for(int i=0;i<5;i++) //入队
{
EnterQueue(s1,a[i]);
}
PrintQueue(s1);
cout<<"出队元素为:"<<DelQueue(s1,s2)->data<<endl;
PrintQueue(s1);
return 0;
}