面试题7:用两个栈实现队列
题目链接:http://ac.jobdu.com/problem.php?pid=1512
思路:题目要求我们利用两个“先进后出”的栈实现一个“先进先出”的队列。
插入时,将插入的元素放入stack1中。假设现在stack1中已经插入了若干元素,
要进行删除操作。显然现在栈顶的元素是后插入的应该后出,栈底的元素才应该
被删除,而在stack1中无法直接删除栈底元素。此时就应该借助stack2,之前
未对stack2进行操作,stack2为空。将stack1中的元素逐个出栈压入stack2中,
那么stack2中的栈顶元素就是要删除的元素。之后要插入元素就压入stack1中,
要删除元素就将stack2栈顶元素删除,若stack2为空,则将stack1的全部元素
逐个出栈压入stack2中,再完成删除,若stack1和stack2都为空,无法完成删除操作。
注意:
1、本题最好写成模板,更为通用。
2、可以写个判断队列是否非空的函数。
code:
1 #include <iostream> 2 #include <stack> 3 #include <string> 4 using namespace std; 5 6 template<typename T> class CQueue 7 { 8 public: 9 CQueue(void); 10 ~CQueue(void); 11 12 void appendTail(const T& node); 13 T deleteHead(); 14 bool empty(); 15 private: 16 stack<T> stack1; 17 stack<T> stack2; 18 }; 19 20 //构造函数 21 template<typename T> CQueue<T>::CQueue(void) 22 { 23 ; 24 } 25 26 //析构函数 27 template<typename T> CQueue<T>::~CQueue(void) 28 { 29 ; 30 } 31 32 template<typename T> void CQueue<T>::appendTail(const T& element) 33 { 34 stack1.push(element); 35 } 36 37 template<typename T> T CQueue<T>::deleteHead() 38 { 39 if (stack2.size() <= 0) 40 { 41 while (stack1.size() > 0) 42 { 43 T& data = stack1.top(); 44 stack1.pop(); 45 stack2.push(data); 46 } 47 } 48 49 T head = stack2.top(); 50 stack2.pop(); 51 return head; 52 } 53 54 template<typename T> bool CQueue<T>::empty() 55 { 56 if (stack1.size() + stack2.size() <= 0) return true; 57 return false; 58 } 59 60 61 int main() 62 { 63 int n; 64 while (cin >> n) 65 { 66 CQueue<int> myQuence; 67 for (int i = 0; i < n; ++i) 68 { 69 string myStr; 70 cin >> myStr; 71 if (myStr == "PUSH") 72 { 73 int k; 74 cin >> k; 75 myQuence.appendTail(k); 76 } 77 else 78 { 79 if (myQuence.empty()) cout << -1 << endl; 80 else cout << myQuence.deleteHead() << endl; 81 } 82 } 83 } 84 return 0; 85 }