题目一:两个栈实现一个队列;也就是利用栈的先进后出实现队列的先进先出特性;这里实现的接口有:入队、出队;
基本思路:
利用两个栈实现队列,也就是说利用栈的先进后出的规则实现队列的先进先出;那么,如图:
因此,对于函数appendTail,只需要对stack1进行入栈操作即可;对于函数deleteHead,当stack2不为空时,stack2的栈顶元素就是最先进入队列的元素,将其出队就;当stack2为空时,吧stack1的数据出栈然后入栈到stack2中。最后将stack2的栈顶元素出队就好。
代码:
template<typename T>
class CQueue
{
public:
CQueue(void);
~CQueue(void);
void appendTail(const T& node);//插入元素,入队操作
T deleteHead(); //出队操作
private:
stack<T> stack1;
stack<T> stack2;
};
template <typename T>
CQueue<T>::CQueue(void)
{
}
template <typename T>
CQueue<T>::~CQueue(void)
{
}
template<typename T>
void CQueue<T>::appendTail(const T& element)
{
stack1.push(element);
}
template<typename T>
T CQueue<T>::deleteHead()
{
if(stack2.size()<= 0)
{
while(stack1.size()>0)
{
T& data = stack1.top();
stack1.pop();
stack2.push(data);
}
}
if(stack2.size() == 0)
throw new exception("queue is empty");
T head = stack2.top();
stack2.pop();
return head;
}
题目二:用两个队列实现栈
思路:
利用队列的先进先出原则实现栈的先进后出;
如图:
代码:
template<typename T>
class Stack
{
public:
Stack(void);
~Stack(void);
void appendTail(const T& node);//插入元素,入栈操作
T deleteTail(); //出栈操作
private:
queue<T> queue1;
queue<T> queue2;
};
template<typename T>
Stack<T>::Stack(void)
{
}
template<typename T>
Stack<T>::~Stack(void)
{
}
template<typename T>
void Stack<T>::appendTail(const T& node)//插入元素,入队操作
{
//queue1.push(node);
if (queue1.size()==0 && queue2.size() ==0)//如果q1与q2都为空,那么往q1中插入元素
{
queue1.push(node);
}
else if (queue1.size()>0)//如果q1不为空,那么往q1中插入元素
{
queue1.push(node);
}
else if(queue2.size()>0)//如果q2不为空,那么往q1中插入元素
{
queue2.push(node);
}
}
template<typename T>
T Stack<T>::deleteTail(void ) //出栈操作
{
T ret;
if (queue2.size() == 0)
{
while(queue1.size() != 1)
{
T& data = queue1.front();
queue1.pop();
queue2.push(data);
}
ret = queue1.front();
queue1.pop();
cout<<ret<<endl;
}
else
{
while(queue2.size() != 1)
{
T& data = queue2.front();
queue2.pop();
queue1.push(data);
}
ret = queue2.front();
queue2.pop();
cout<<ret<<endl;
}
return ret;
}
题目三:栈的入栈和出栈顺序;
输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为该栈的弹出序列;假设压入栈的所有数字均不相等。例如:序列{1,2,3,4,5}是某栈的入栈序列,序列{4,5,3,2,1}是该栈的一个弹出序列,但是{4,3,5,1,2}就不可能是该栈的弹出序列;
分析:借助一个辅助栈来实现。
代码:
bool IsPopOrder(const int *pusharr,const int *poparr,int len)
{
if(pusharr == nullptr || poparr == nullptr || len <= 0)
return false;
bool flag = false;
stack<int> st1;
const int *pnextpush = pusharr;
const int *pnextpop = poparr;
while(pnextpop - poparr < len)//遍历整个弹出序列
{
while(st1.empty() || st1.top() != *pnextpop)//当栈为空或者栈顶元素不等于*pnextpop时
{
if(pnextpush - pusharr == len)//表示压栈序列中的左右数字都在辅助栈中
{
break;
}
//压入压栈序列的数字
st1.push(*pnextpush);
pnextpush++;
}
if(st1.top() != *pnextpop)
{
break;
}
st1.pop();
pnextpop++;
}
//最终,当辅助栈为空并且pnextpop指向出栈序列的尾部时,表示此出栈序列合法
if(st1.empty() && pnextpop-poparr == len)
{
flag = true;
}
return flag;
}