C++实现栈

    xiaoxiao2022-07-12  180

    @这篇文档是由C++代码实现栈

    栈就是先进后出的一种数据结构,这篇文档通过数组实现栈,要求是:栈是顺序的(即栈的长度初始化后给定了,如果栈中插入元素到了最后一个位置表示栈已满不能再插入新的元素),其次栈的插入类型没有定,所以建立的是模板类和函数模板,最后通过调用类模板在main()函数中实现。

    本文是以Visual Studio中新建的C++win32的控制台应用程序实现的,其中建立了头文件和源文件以及实现main()的demo文件,分别是MyStack.h和MyStack.cpp和demo.cpp文件。

    MyStack.h文件

    #ifndef MYSTACK_H #define MYSTACK_H template <typename T> class MyStack { public: MyStack(int length); virtual ~MyStack(); int MyStackLen(); bool MyStackEmpty(); bool MyStackFull(); void ClearMyStack(); bool InsertElement(T element); bool DeleteElement(T &element); bool TraversalMyStack(); private: T* m_tMyStack; int m_iMyStackLength; int m_iMyStackCapacity; int m_iTos; }; #endif

    MyStack.cpp文件

    #include "MyStack.h" #include <iostream> using namespace std; template <typename T> MyStack<T>::MyStack(int length) { m_iMyStackCapacity = length; m_tMyStack = new T[m_iMyStackCapacity]; ClearMyStack(); } template <typename T> MyStack<T>::~MyStack() { delete []m_tMyStack; m_tMyStack = NULL; } template <typename T> int MyStack<T>::MyStackLen() { cout << "此时的队列长度为:" << m_iMyStackLength << endl; return 0; } template <typename T> bool MyStack<T>::MyStackEmpty() { return 0 == m_iTos?true:false; //为什么要把0写到==前面?是因为防止将==写成=,如果写错了之后程序就会报错。 } template <typename T> bool MyStack<T>::MyStackFull() { return m_iTos== m_iMyStackCapacity?true:false; } template <typename T> void MyStack<T>::ClearMyStack() { m_iMyStackLength = 0; m_iTos = 0; cout << "已经成功清除栈内的所有元素!" << m_iMyStackLength << endl; } template <typename T> bool MyStack<T>::InsertElement(T element) { if(MyStackFull()) { cout << "该栈已满,不能再插入新的元素!" << endl; return false; } else { m_tMyStack[m_iTos] = element; m_iTos++; m_iMyStackLength++; cout << "已成功加入新的元素:" << element << endl; return true; } } template <typename T> bool MyStack<T>::DeleteElement(T &element) { if(MyStackEmpty()) { cout << "该栈为空,不能再删除元素!" << endl; return false; } else { m_iTos--; element = m_tMyStack[m_iTos]; m_iMyStackLength--; cout << "已成功删除元素:" << element << endl; return true; } } template <typename T> bool MyStack<T>::TraversalMyStack() { if(MyStackEmpty()) { cout << "该栈为空,不能遍历出任何元素!" << endl; return false; } else { cout << "现将栈内的元素一一打印如下:" << endl; for(int i=(m_iTos-1);i>=0; i--) { cout << m_tMyStack[i] << endl; } return true; } }

    demo.cpp文件(这个文件中实例化模板类一定要注意将MyStack.cpp文件包含进来,要不然会报错)

    #include <iostream> #include "MyStack.h" #include "MyStack.cpp" using namespace std; int main(void) { MyStack<double> stack(5); stack.InsertElement(10.1); stack.InsertElement(11.2); stack.InsertElement(12.3); stack.InsertElement(13.4); stack.InsertElement(14.5); stack.InsertElement(15.6); stack.TraversalMyStack(); double e =0.1; stack.DeleteElement(e); cout << endl; stack.TraversalMyStack(); cout << endl; stack.MyStackLen(); stack.TraversalMyStack(); cout << endl; stack.ClearMyStack(); stack.TraversalMyStack(); system("pause"); return 0; }

    栈的实现和队列的实现不一样的地方就是栈只需要一个指针m_iTos来记录栈中元素的位置,所以无论是插入元素还是删除元素,都相对来说简单一些,只是在 标记元素的时候需要注意++和–的先后顺序。

    最新回复(0)