栈(Stack)是一种线性存储结构,它具有如下特点:
栈中的数据元素遵守”先进后出"(First In Last Out)的原则,简称FILO结构。限定只能在栈顶进行插入和删除操作。栈的相关概念:
栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。压栈:栈的插入操作,叫做进栈,也称压栈、入栈。弹栈:栈的删除操作,也叫做出栈。例如我们有一个存储整型元素的栈,我们依次压栈:{1,2,3}
在压栈的过程中,栈顶的位置一直在”向上“移动,而栈底是固定不变的。 如果我们要把栈中的元素弹出来:
出栈的顺序为3、2、1 ,顺序与入栈时相反,这就是所谓的”先入后出“。 在弹栈的过程中,栈顶位置一直在”向下“移动,而栈底一直保持不变。
如果你玩过一种称为汉诺塔的益智玩具,你就会知道游戏中小圆盘的存取就是一种先进后出的顺序,一个圆柱就是一个栈:
栈的常用操作为:
弹栈,通常命名为pop压栈,通常命名为push求栈的大小判断栈是否为空获取栈顶元素的值 2、栈的C++封装 .h文件: #ifndef ZZCSTACK_H #define ZZCSTACK_H class CZzcStack { public: CZzcStack(int nSize);//为栈分配内存 ~CZzcStack(); //回收栈内存 bool IsStackEmpty();//判断栈是否为空 bool IsStackFull();//判断栈是否为满 void ClearStack();//清空栈 int GetStackLength();//获取栈中元素的个数 bool PushStackToTail(char cItem);//压入栈尾,也可将其它复杂的结构体替代char型。 bool PopStackFromTail(char &cItem);//将栈尾元素出栈 void StackTraverse(bool bFromButton);//遍历栈中的元素 private: char *m_pBuffer;//栈空间指针 int m_nCapacity;//栈容量 int m_nTop;//栈顶 }; #endif .Cpp文件: #include "StdAfx.h" #include "ZzcStack.h" #include<iostream> using namespace std; CZzcStack::CZzcStack(int nSize) { m_nCapacity = nSize; m_pBuffer = new char[m_nCapacity]; m_nTop = -1;//初始化时栈顶为-1 } CZzcStack::~CZzcStack() { delete[]m_pBuffer; m_pBuffer = NULL; } bool CZzcStack::IsStackEmpty() { if (-1 == m_nTop) { return true; } return false; } bool CZzcStack::IsStackFull() { if (m_nTop >= m_nCapacity-1) { return true; } return false; } void CZzcStack::ClearStack() { m_nTop = -1; } int CZzcStack::GetStackLength() { return m_nTop+1; } bool CZzcStack::PushStackToTail(char cItem) { if (IsStackFull()) { return false; } m_nTop++; m_pBuffer[m_nTop] = cItem; return true; } bool CZzcStack::PopStackFromTail(char &cItem) { if (IsStackEmpty()) { return false; } cItem = m_pBuffer[m_nTop]; m_nTop--; return true; } void CZzcStack::StackTraverse(bool bFromButton) { if (bFromButton) { for (int i = 0;i <= m_nTop;i++) { cout<<m_pBuffer[i]<<","; } } else { for (int i = m_nTop;i >=0;i--) { cout<<m_pBuffer[i]<<","; } } cout<<endl; } 理论部分内容借鉴自: 点击打开链接