您的位置:首页 > 职场人生

面试题7:用两个栈实现队列

2015-10-23 22:00 309 查看
#include<iostream>
//思路:定义两个栈
//往pTopOne中压入栈中
//如果pTopTwo知否为空
//                 1.若为空 如果栈pTopOne为空  返回-1
//                         不为空    将栈pTopOne  中的  出栈  全部拿到栈pTopTwo
//                 2.不为空直接  将栈  pTopTwo  出栈
using namespace std;

//定义栈的结构体
struct Stack
{
int nValue;
Stack *pNext;
};
//压栈
void Push(Stack **pTop,int nValue)
{
if(pTop == NULL)
{
return ;
}
Stack *pStack= new Stack;
pStack->nValue = nValue;
pStack->pNext = (*pTop);//栈顶指针移动
(*pTop) = pStack;//新来的结点 为栈顶
}
//出栈
int Pop(Stack **pTop)
{
if(pTop == NULL ||(*pTop) == NULL)
{
return -1;
}
Stack *pDel = (*pTop);//标记要删除的栈顶
int nValue =pDel->nValue;
(*pTop) = (*pTop)->pNext;//栈顶指针移动
delete pDel ;
pDel = NULL;
return nValue;
}

void PushQueue(Stack **pTopOne,int nValue)
{
if(pTopOne == NULL)
{
return ;
}
Push(pTopOne,nValue);//将  元素  压入 栈pTopOne中
}

int PopQueue(Stack **pTopOne,Stack **pTopTwo)
{
int nValue ;
if((*pTopTwo) == NULL)//如果栈 pTopTwo 为空
{
if((*pTopOne) == NULL)//如果栈 pTopTwo 为空 ,没有元素 返回 -1
{
return -1;
}
while(/*(*pTopOne)!=NULL*/(nValue=Pop(pTopOne))!=-1)//栈 pTopOne 不为空 ,全部压入栈  pTopTwo中
{
Push(pTopTwo,nValue);
}
}
return Pop(pTopTwo);//返回  pTopTwo  栈顶
}

int main()
{
Stack *pTopOne = NULL;
Stack *pTopTwo = NULL;
PushQueue(&pTopOne,1);
cout<<PopQueue(&pTopOne,&pTopTwo)<<endl;
cout<<PopQueue(&pTopOne,&pTopTwo)<<endl;
PushQueue(&pTopOne,2);
PushQueue(&pTopOne,3);
cout<<PopQueue(&pTopOne,&pTopTwo)<<endl;
PushQueue(&pTopOne,4);
PushQueue(&pTopOne,5);
cout<<PopQueue(&pTopOne,&pTopTwo)<<endl;
cout<<PopQueue(&pTopOne,&pTopTwo)<<endl;
cout<<PopQueue(&pTopOne,&pTopTwo)<<endl;
cout<<PopQueue(&pTopOne,&pTopTwo)<<endl;
PushQueue(&pTopOne,6);
PushQueue(&pTopOne,7);
cout<<PopQueue(&pTopOne,&pTopTwo)<<endl;
cout<<PopQueue(&pTopOne,&pTopTwo)<<endl;
cout<<PopQueue(&pTopOne,&pTopTwo)<<endl;
system("pause");
return 0;
}
#include<iostream>
#include<stack>
using namespace std;

template<typename T>
class CQueue
{
public :
CQueue();
~CQueue();
void appendTail(const T &node);
T deleteHead();
private:
stack<T> stack1;
stack<T> stack2;
};
template<typename T>
CQueue<T>::CQueue()
{
}
template<typename T>
CQueue<T>::~CQueue()
{
while(!stack1.empty())
{
stack1.pop();
}
while(!stack2.empty())
{
stack2.pop();
}
}
template<typename T>
void CQueue<T>::appendTail(const T &node)
{
stack1.push(node);
}
template<typename T>
T CQueue<T>::deleteHead()
{
if(stack2.empty() == true)
{
while(stack1.size()>0)
{
stack2.push(stack1.top());
stack1.pop();
}
}
T head = stack2.top();
stack2.pop();
return head;
}
int main()
{
CQueue<int> queue;
for(int i=0;i< 10;i++)
{
queue.appendTail(i);
}
for(int i=0;i<10;i++)
{
cout<<queue.deleteHead()<<endl;
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: