日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构基础(6) --顺序栈的设计与实现

發布時間:2025/3/17 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构基础(6) --顺序栈的设计与实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

棧是一種只允許在一端進行插入或刪除操作的線性表.其特點為:先進后出(FILO)/后進先出(LIFO);

?

棧?VS.?隊列

? ? 棧和隊列都是動態集合,?但在棧中,?可以去掉的是最近插入的那一個,:棧實現了一種后進先出(last-in,?first-out)的策略;類似的,?在隊列中,?可以去掉的元素總是在集合中存在時間最長的那一個:隊列實現了先進先出(first-in,?first-out)的策略[下一篇我們著重復習隊列].

?

棧的示意圖:


//順序棧的實現與解析 template <typename Type> class MyStack {template <typename T>friend ostream &operator<<(std::ostream &os, const MyStack<T> &stack); public:MyStack(int stackCapacity = 16);~MyStack();bool isEmpty() const;void push(const Type &item);void pop() throw (std::range_error);const Type &top() const throw(std::range_error);private:Type *m_stack;int m_top;int m_capacity; }; template <typename Type> MyStack<Type>::MyStack(int stackCapacity):m_capacity(stackCapacity) {if (m_capacity < 1)throw std::range_error("new size must >= 1");//申請內存并構造對象m_stack = new Type[m_capacity];if (m_stack == NULL)throw std::bad_alloc();m_top = -1; } template <typename Type> MyStack<Type>::~MyStack() {//析構對象并釋放內存delete []m_stack;m_stack = NULL;m_top = -1; //將top指針指向無效m_capacity = 0; } //全局函數:數組放大/縮小 template <typename Type> static void changeSize1D(Type *&array, int oldSize, int newSize) throw (std::range_error, std::bad_alloc) {if (newSize < 0)throw std::range_error("new size must >= 0");Type *tmp = new Type[newSize];if (tmp == NULL)throw std::bad_alloc();int minSize = std::min(oldSize, newSize);std::copy(array, array+minSize, tmp);delete []array; //將原數組釋放掉array = tmp; //將原指針指向新申請的數組 }template <typename Type> void MyStack<Type>::push(const Type &item) {//數組最大容量為m_capacity, 因此數組的最大下標為m_capacity-1if (m_top >= m_capacity-1){changeSize1D(m_stack, m_capacity, m_capacity * 2); //一次擴容2倍m_capacity *= 2;}//將元素插入棧頂m_stack[++ m_top] = item; } //棧是否為空 template <typename Type> inline bool MyStack<Type>::isEmpty() const {return -1 == m_top; } template <typename Type> inline const Type &MyStack<Type>::top() const throw (std::range_error) {if (isEmpty())throw std::range_error("stack is empty");return m_stack[m_top]; //返回棧頂元素 } template <typename Type> inline void MyStack<Type>::pop() throw (std::range_error) {if (isEmpty())throw std::range_error("stack is empty");//注意:如果該棧保存的對象類型的元素, 則需要顯示調用其析構函數,//同時還需要將棧頂指針下移m_stack[m_top --].~Type(); } //輸出棧的所有內容,以便測試 template <typename Type> ostream &operator<<(ostream &os, const MyStack<Type> &stack) {os << stack.m_stack[0];for (int i = 1; i <= stack.m_top; ++i)os << ' ' << stack.m_stack[i];return os; }

附-測試代碼

int main() {MyStack<int> iStack;iStack.push(10);iStack.push(22);iStack.push(15);cout << iStack << endl;try{cout << "Top = " << iStack.top() << endl;iStack.pop();cout << "Top = " << iStack.top() << endl;iStack.pop();cout << "Top = " << iStack.top() << endl;iStack.pop();cout << "Top = " << iStack.top() << endl;}catch (const std::exception &e){cout << e.what() << endl;} }

總結

以上是生活随笔為你收集整理的数据结构基础(6) --顺序栈的设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。