题目链接: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 #include2 #include 3 #include 4 using namespace std; 5 6 template 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 stack1;17 stack stack2;18 };19 20 //构造函数21 template CQueue ::CQueue(void)22 {23 ;24 }25 26 //析构函数27 template CQueue ::~CQueue(void)28 {29 ;30 }31 32 template void CQueue ::appendTail(const T& element)33 {34 stack1.push(element);35 }36 37 template T CQueue ::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 bool CQueue ::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 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 else78 {79 if (myQuence.empty()) cout << -1 << endl;80 else cout << myQuence.deleteHead() << endl;81 }82 }83 }84 return 0;85 }