问题重述:
题目:用两个栈实现一个队列,分别完成在队尾插入节点和在对头删除节点的功能。
解题思路:
用两个栈实现一个队列,栈是先进后出的,队列是先进先出的,这就要求两个栈协作起来才能实现队列的功能。具体的一些思路见代码部分。
代码实现:
template<typename T>
class stack
{
public:
stack(int size = 10)
:_size(size), _top(0)
{
}
bool empty()
{
return _top == 0;
}
bool full()
{
return _top == _size;
}
void insert(const T &val)
{
if (full())
{
return;
}
_data[_top++] = val;
}
T del()
{
if (empty())
{
return -1;
}
return _data[--_top];
}
private:
T _data[10];
int _size;
int _top;
};
template<typename T, typename Stack = stack<T>>
class CQueue
{
public:
/*
1.进队
先要判断队列是否是否为满:当s1满,s2不为空时,对满时不能进行插入操作
若s1不满直接进行插入。
若s1满,直接将s1的元素逐一插入到s2之中,然后将待插入的元素插入到s1之中
2.出队
判断队列是否为空:当s1和s2都为空时,当队空时不能进行出队操作
若s2不为空,直接进行出队
若s2为空,将s1的元素逐一插入到s2之中,然后进行出队
*/
bool empty()
{
return (s1.empty()&&s2.empty());
}
bool full()
{
return (s1.full() && (!s2.empty()));
}
void push(const T &val)
{
if (!full())
{
if (!(s1.full()))
{
s1.insert(val);
return;
}
//若s1为满
while (!(s1.full()))
{
s2.insert(s1.del());
}
s1.insert(val);
}
}
void pop()
{
if (!empty())
{
if (!s2.empty())
{
cout << s2.del() << endl;
return;
}
//cout << "****" << endl;
while (!(s1.empty()))
{
//cout << s1.del() << endl;
s2.insert(s1.del());
}
//cout << "****" << endl;
cout << s2.del() << endl;
}
}
private:
//定义两个栈 来模拟队列
//s1 用于进队 s2用于出队
Stack s1;
Stack s2;
};
测试:
int main()
{
CQueue<int> que;
//cout<<que.empty()<<endl;
que.push(1);
que.pop();
que.push(1);
que.push(2);
que.pop();
que.push(3);
que.pop();
que.pop();
/*while (!que.empty())
{
que.pop();
}*/
return 0;
}
通过上面的测试,可以发现代码是正确的。
出队打印的序列为:1 1 2 3