您的位置:首页 > 理论基础 > 数据结构算法

数据结构——Stack和Queue的互相实现

2015-06-24 22:55 531 查看
这里所说的队列和栈都是STL中的queue/stack。具体操作有如下:

stack s;//头文件stack.h

s.empty(); s.size();

s.pop(); //delete

s.push(1); int a=s.top();

queue s;//头文件queue.h

s.empty(); s.size();

s.front(); s.back();

s.pop();//delete

s.push(1);

priority_queue s;/头文件queue.h,优先队列,默认使用元素<操作符确定优先关系,优先级最高的在队列头部/

在queue 基础上多一个操作 s.top(),而且s.push(1)操作位置不同。

直接上程序,思路不解释:

template<typename T>//两个stack实现Queue
class Queue{
private:
stack<T> s1,s2;
T back_elem;
public:
bool empty()const{return (s2.empty()&&s1.empty()) ;}
int size()const{  return s2.size()+s1.size(); }
void push(T elem) {   s1.push(elem);  back_elem=elem; }
void pop(){   if(!s2.empty())   s2.pop();
else
if(!s1.empty())  {
while(!s1.empty()){ s2.push(s1.top);s1.pop();}
s2.pop();
}
else  cout<<"error pop,Queue is empty!"<<endl;
}
T front(){    if(!s2.empty()) return s2.top();
else
if(!s1.empty()){
while(!s1.empty()){ s2.push(s1.top());s1.pop();}
return s2.top();
}
else cout<<"error front,Queue is empty!"<<endl;
}
T  back(){    if(!empty())   return back_elem;
else   cout<<"error back,Queue is empty!"<<endl;
}
};
template<typename T>//两个Queue实现stack
class Stack{
private://每次保证队列一个为空一个非空
queue<T> q1,q2;
bool f1,f2;//标记那个队列非空。
public:
Stack(){f1=true;f2=false;}//f1,f2必定一个为真一个为假
bool empty()const{return q1.empty()&&f1 || q2.empty()&& f2;}
int size()const{
if(!q1.empty()&&f1) return q1.size();
if(!q2.empty()&&f2) return q2.size();
return 0;
}
void pop(){
if(!q1.empty()&&f1){
while(q1.size()!=1){
q2.push(q1.front());
q1.pop(); }
q1.pop(); f1=false;f2=true;
return;
}
if(!q2.empty() &&f2){
while(q2.size()!=1){
q1.push(q2.front());
q2.pop();  }
q2.pop();f2=false;f1=true;
return;
}
std::cout<<"pop error,Stack is empty!"<<endl;
}
void push( T elem){
if(f1) q1.push(elem);
else q2.push(elem);
}
T top(){
if(!q1.empty() && f1) return q1.back();
if(!q2.empty() &&f2 ) return q2.back();
std::cout<<"top error,Stack is empty!"<<endl;
return 0;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: