首页 > 代码库 > 两个栈实现双端队列
两个栈实现双端队列
一个笔试题,当时竟然没想出来,现在实现下
1 /* 2 用两个栈实现双端队列 3 栈s1,s2。 4 pushback()和popback(),必须在s2为空的情况,把s2的都放s1中 5 pushfront()和popfront(),必须是在s1为空,把s1的都给放到s2中 6 */ 7 #include <iostream> 8 #include <stack> 9 using namespace std; 10 template <typename T> 11 class DequeBy2Stack 12 { 13 private: 14 int maxsize; 15 stack<T> s1; 16 stack<T> s2; 17 public: 18 DequeBy2Stack(int size):maxsize(size){} 19 void pushback(T n); 20 T popback(); 21 void pushfront(T n); 22 T popfront(); 23 int size(); 24 bool empty(); 25 }; 26 template <typename T> 27 bool DequeBy2Stack<T>::empty() 28 { 29 return s2.empty()&&s1.empty(); 30 } 31 template <typename T> 32 int DequeBy2Stack<T>::size() 33 { 34 return s1.size()+s2.size(); 35 } 36 template <typename T> 37 void DequeBy2Stack<T>::pushback(T n) 38 { 39 if(this->size()==maxsize) 40 { 41 throw new std::exception("Invalid push"); 42 } 43 while(!s2.empty()) //必须将s2中的数据都导入到s1中 44 { 45 int tmp=s2.top(); 46 s1.push(tmp); 47 s2.pop(); 48 } 49 s1.push(n); 50 } 51 template <typename T> 52 T DequeBy2Stack<T>::popback() 53 { 54 while(!s2.empty()) 55 { 56 int tmp=s2.top(); 57 s1.push(tmp); 58 s2.pop(); 59 } 60 if(!s1.empty()) 61 { 62 int tmp=s1.top(); 63 s1.pop(); 64 return tmp; 65 } 66 else 67 { 68 throw new exception("Invalid popback()"); 69 } 70 } 71 template <typename T> 72 void DequeBy2Stack<T>::pushfront(T n) 73 { 74 if(this->size()==maxsize) 75 { 76 throw new std::exception("Invalid push"); 77 } 78 while(!s1.empty()) 79 { 80 int tmp=s1.top(); 81 s2.push(tmp); 82 s1.pop(); 83 } 84 s2.push(n); 85 } 86 template <typename T> 87 T DequeBy2Stack<T>::popfront() 88 { 89 while(!s1.empty()) 90 { 91 int tmp=s1.top(); 92 s2.push(tmp); 93 s1.pop(); 94 } 95 if(!s2.empty()) 96 { 97 int tmp=s2.top(); 98 s2.pop(); 99 return tmp;100 }101 else102 {103 throw new exception("Invalid popfront");104 }105 }106 107 int main()108 {109 DequeBy2Stack<int> test(8);110 int n;111 for(int i=1;i<=8;i++)112 {113 test.pushback(i);114 }115 test.popback();116 test.popfront();117 test.popfront();118 test.popfront();119 test.pushfront(100);120 test.pushfront(101);121 test.pushback(30);122 test.pushfront(102);123 test.popfront();124 while(!test.empty())125 cout<<test.popback()<<endl;126 system("pause");127 }128
两个栈实现双端队列
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。