栈
来源:互联网 发布:二维条码扫描软件 编辑:程序博客网 时间:2024/06/05 00:13
栈(stack)(数据结构中的栈)是一种动态集合,且在其上进行delete操作所移除的元素
是预先设定的。被删除的元素是最近插入的元素:栈实现的是一种后进先出的策略。
栈分为顺序栈和链栈,下面就两种栈分别用c++实现其基本功能。
一、顺序栈:(c++实现)
- 1.
#include <iostream> using namespace std;//顺序栈; template <typename T> class stack{ public: //构造函数; stack() { m_iTop = -1; memset(m_Array, 0, sizeof(m_Array)); }//析构函数; ~stack() {}private: //栈的容量; enum {m_iCapacity = 10}; //指向栈顶的索引; int m_iTop; //存储数据的数组; T m_Array[m_iCapacity]; public: //判断栈空; bool isEmpty() { f (m_iTop == -1) { return true; } return false; } //判断栈满; bool isFull() { if (m_iTop == m_iCapacity - 1) { return true; } return false; } //入栈; void push_back(T _element) { if (isFull()) { cout<<"stack is full!"<<endl; return; } m_iTop++; m_Array[m_iTop] = _element; } //出栈; void pop_back() { if (isEmpty()) { cout<<"stack is empty!"<<endl; return; } m_Array[m_iTop] = NULL; m_iTop--;} //清空栈; void clear() { memset(m_Array, 0, sizeof(m_Array)); m_iTop = -1; } //获得栈中元素数目; int size() { return (m_iTop+1); } //获得栈顶元素; int getPopElement() { if (isEmpty()) { cout<<"stack is empty!"<<endl; return NULL; } return m_Array[m_iTop]; }};
//测试代码;stack<int> _stack;if (_stack.isEmpty()){ cout<<"_stack is empty"<<endl;}cout<<" "<<_stack.getPopElement()<<endl;for (int j = 0; j<15; j++){ _stack.push_back(j);}cout<<" "<<_stack.getPopElement()<<endl;cout<<"_stack size : "<<_stack.size()<<endl;_stack.pop_back();cout<<"_stack size : "<<_stack.size()<<endl;for (int j = 0; j<16; j++){ _stack.pop_back();}cout<<"_stack size : "<<_stack.size()<<endl;
二、链栈:(c++实现)
#include <iostream>using namespace std;//链栈;template <typename T>class ListStack {private: struct Node { T data ; // 数据; Node* pNext ; //下一个节点的指针; }; Node* m_pHead; //头节点; int m_iCount; //节点数目;public: //构造函数; ListStack() { m_iCount = 0; m_pHead = nullptr; } //析构函数; ~ListStack() { }public: //判断空栈; bool isEmpty() { if (m_pHead == nullptr) { return true; } return false; } //向栈顶添加元素; bool push_back(T _element) { Node* pTemp = new Node(); if (!pTemp) { return false; } pTemp->data = _element; pTemp->pNext = m_pHead; m_pHead = pTemp; m_iCount++; return true; } //删除栈顶元素; void pop_back() { if (!m_pHead) { return; } Node* pTemp = m_pHead; m_pHead = m_pHead->pNext; delete pTemp; pTemp = nullptr; --m_iCount; } //获得栈中元素数量; const int& size() { return m_iCount; } //清空栈; void clear() { Node* pTemp = nullptr; while (m_pHead) { pTemp = m_pHead; m_pHead = m_pHead->pNext; delete pTemp; pTemp = nullptr; --m_iCount; } } //获得栈顶元素; const T& getHeadElement() { if (!m_pHead) { cout<<"stack is empty! get head element fail!"<<endl; return NULL; } return m_pHead->data; }};//测试链栈;ListStack<int> _stack; cout<<"_stack size:: "<<_stack.size()<<endl; _stack.pop_back(); _stack.push_back(1); cout<<"_stack size : "<<_stack.size()<<" "<<_stack.getHeadElement()<<endl; for (int j = 0; j<100; j++) { _stack.push_back(j); } cout<<"_stack size::"<<_stack.size()<<endl; int a[] = {1,3,24,58}; int b[] = {100,302,33}; ListStack<int*> _stack1; cout<<"_stack1 size:: "<<_stack1.size()<<endl; _stack1.push_back(a); _stack1.push_back(b); cout<<"_stack1 size: "<<_stack1.size()<<endl; _stack1.pop_back(); cout<<"_stack1 size: "<<_stack1.size()<<endl; const int* p = _stack1.getHeadElement(); for (int j = 0; j<4; j++) { cout<<" , "<<p[j]<<endl; } _stack1.pop_back(); cout<<"_stack1 size:: "<<_stack1.size()<<endl; _stack1.push_back(a); _stack1.push_back(b); cout<<"_stack1 size:: "<<_stack1.size()<<endl; _stack1.clear(); cout<<"_stack1 size:: "<<_stack1.size()<<endl;
0 0