剣指offer第五題:2つのスタックでキューを実現する(c++実現)
2つのスタックで1つのキューを実現し、キューのPushとPop操作を完了します.キュー内の要素はintタイプです.考え方:スタックに入る時に要素をstack 1に入れ、同時にstack 2が空であるかどうかを判断し、空であればstack 1中の要素を順番にstack 2にスタックする.スタックを出るとき1)まずstack 2が空であるか否かを判断し、空であればstack 1が空であるか否かを判断し、stack 1が空でなければその要素をすべてstack 2にスタックする.2)stack 2のスタックトップ要素を取得する、stack 2に対してスタックアウト動作を実行する.
具体的な考え方は以下の文章を参考にすることができる.
剣指Offer面接問題:6.2つのスタックでキューを実装
『剣指offer』--2つのスタックでキューを実現
#include
#include
#include
#include
using namespace std;
class myList
{
private:
stack stack1;//
stack stack2;//
public:
myList(/* args */);
~myList();
//
void push(int node) {
stack1.push(node);// stack1
if(stack2.empty())// stack1 stack2
{
while(!stack1.empty())// stack1 stack2
{
stack2.push(stack1.top());
stack1.pop();
}
}
}
int pop() {//
if(stack2.empty())//stack
{
while (!stack1.empty())//stack1 stack2
{
stack2.push(stack1.top());
stack1.pop();
}
}
int result=stack2.top();// stack2
stack2.pop(); //stack2
return result;
}
//
int top(){
if(stack2.empty())//stack2
{
if(!stack1.empty())//stack1 , stack2
{
while (!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
}
}
else//stack1 ,
{
return -1;
}
}
return stack2.top();// stack2
}
//
bool isEmpty(){
if(stack1.empty()&&stack2.empty())//stack1 stack2
{
return true;
}
else//
{
return false;
}
}
//
int size(){
return stack1.size()+stack2.size();
}
};
myList::myList(/* args */)
{
}
myList::~myList()
{
}
//
void printPop(myList* lst)
{
int tmp=lst->pop();
if(tmp==-1)
cout<top();
if(tmp==-1)
cout<push(i*2);
}
printTop(tstLst);
printPop(tstLst);
printTop(tstLst);
tstLst->push(9);
printPop(tstLst);
printPop(tstLst);
printPop(tstLst);
printPop(tstLst);
printPop(tstLst);
printTop(tstLst);
tstLst->push(3);
tstLst->push(4);
printTop(tstLst);
printPop(tstLst);
printTop(tstLst);
for(int i=0;i<5;i++)
{
tstLst->push(i*3);
}
printPop(tstLst);
return 0;
}
具体的な考え方は以下の文章を参考にすることができる.
剣指Offer面接問題:6.2つのスタックでキューを実装
『剣指offer』--2つのスタックでキューを実現