程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 棧和隊列常見問題及其算法和c++實現

棧和隊列常見問題及其算法和c++實現

編輯:C++入門知識

棧和隊列常見問題及其算法和c++實現


1.實現一個棧,要求實現push,pop,Min(返回最小值的操作)的時間復雜度為O(1) 算法思想:需要設計一個輔助棧,用來存儲當前棧中元素的最小值。額外需要注意push操作,第一個元素不用比較,自動成為最小值入棧,其他元素每次都要和棧頂元素進行比較,小的入棧。  #include<iostream> #include<stack>      //直接用系統中的棧,不需要自己實現 using namespace std; template<class T> class Stack { public: void push(const T& x) { _stack.push(x); if (_minstack.empty())  { _minstack.push(x); } else { if (x < _minstack.top()) { _minstack.push(x); } else { _minstack.push(_minstack.top()); } } } void pop() { _stack.pop(); _minstack.pop(); } T Retmin() { return _minstack.top(); } private: stack<T> _stack; stack<T> _minstack; }; void test() { Stack<int> s; int ret; s.push(3); s.push(2); s.push(5); s.push(1); s.push(7);   s.pop(); s.pop(); ret = s.Retmin(); cout << "最小值是:" << ret << endl; }   int main() { test(); return 0; } 2.元素出棧入棧順序的合法性檢查 算法思想:用for循環將數組1中的元素入棧,每入棧一個與數組2中當前元素進行進行比較,如果相同就出棧,數組2中下一個元素作為當前元素。如果循環結束,而棧中還有元素,就說明數組2不是pop序列。 #include<iostream> #include<stack> using namespace std; bool InvalidCheck(int* stack_in, int* stack_out, int len1, int len2) { stack<int> s; if (len1 != len2) { return false; } int i = 0, j = 0; for (i = 0, j = 0; i < len1; i++) { s.push(stack_in[i]); while (s.size()>0 && s.top() == stack_out[j]) { s.pop(); j++; } } if (s.size() > 0) return false; else return true; } int main() { int stack_in[] = { 1, 2, 3, 4, 5 }; int stack_out[] = { 4, 5, 1, 2, 3 }; int len1 = sizeof(stack_in) / sizeof(stack_in[0]); int len2 = sizeof(stack_out) / sizeof(stack_out[0]); bool ret = InvalidCheck(stack_in, stack_out, len1, len2); if (ret) { cout << "出棧順序合法!" << endl; } else { cout << "出棧順序不合法!" << endl; } return 0; }  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved