您的位置:首页 > 编程语言 > C语言/C++

两个栈实现队列+两个队列实现栈----C++

2015-03-10 21:38 288 查看
1. 两个栈实现队列

思路: 我们先想象下队列有哪些功能?进队列(push)、出队列(pop)、队首元素(front)、队尾元素(back)。

这里使用了两个栈stack1和stack2。进队列(push),直接进stack1。出队列(pop),若stack2非空,我们需要的恰好在栈顶,出栈;若stack2空,则所有stack1元素,并入stack2,再出栈。队首和队尾元素恰好就在两个栈的top位置。

代码:

#include<iostream>
#include<stack>
using namespace std;

template<class T>
class NQueue
{
public:
void push(const T&t)
{
s1.push(t);
}

void pop()
{
if(qSize()!=0)
{
if(s2.empty())
{
s1Tos2();
}
s2.pop();
}
else
{
cout<<"队列已为空"<<endl;
}
}

T& front()
{
if(s2.empty())
{
s1Tos2();
}
return	s2.top();
}

T& back()
{
return s1.top();
}

void s1Tos2()
{
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}

int qSize()
{
return s1.size()+s2.size();
}

private:
stack<T> s1;
stack<T> s2;
};

int main()
{
NQueue<int> mq;
int i;
for(i=0;i<10;++i)
{
mq.push(i);
}
cout<<"back value is :"<<mq.back()<<endl;
cout<<"front value is :"<<mq.front()<<endl;
cout<<"size value is :"<<mq.qSize()<<endl;

for(i=0;i<10;++i)
{
cout<<mq.front()<<" ";
mq.pop();
}
cout<<endl;

return 0;
}


2. 两个队列实现栈

思路:

所有元素a b c进入q1,因为我们的目的是栈,也就是最先出c,儿队是从队头开始出,所有先把a b 出q1并入q2,此时目标c 跑到了队头,出q1。此时q1已经为空,下一个要出的是b,把a从q2出队并进q1,此时目标b在q2队头,出队........

即:把非空队列的n-1个压人空对列,剩的第n个出队...即总有一个队列为空。

代码:

#include<iostream>
#include<queue>
using namespace std;

template<class T>
class NStack
{
public:
void push(const T&t)
{
q1.push(t);
}
void pop()
{
if(sSize!=0)
{
if(!q1.empty())
{
putN_1ToAnother();
q1.pop();
}
else
{
putN_1ToAnother();
q2.pop();
}
}
else
{
cout<<"栈已为空"<<endl;
}

}

T& top()
{
if(!q1.empty())
{
return  q1.back();
}
else
{
return q2.back();
}
}
void putN_1ToAnother()
{
if(!q1.empty())
{
while(q1.size()>1)
{
q2.push(q1.front());
q1.pop();
}

}
else if(!q2.empty())
{
while(q2.size()>1)
{
q1.push(q2.front());
q2.pop();
}
}
}

int sSize()
{
return q1.size()+q2.size();
}

private:
queue<T> q1;
queue<T> q2;
};

int main()
{
NStack<int> mq;
int i;
for(i=0;i<10;++i)
{
mq.push(i);
}
cout<<"top value is :"<<mq.top()<<endl;

cout<<"size value is :"<<mq.sSize()<<endl;

for(i=0;i<10;++i)
{
mq.pop();

}
cout<<endl;

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: