这里所说的队列和栈都是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;
}
};