曾品闲的数据结构复习之二:栈(Stack)

数据结构复习之——栈

一.基本概念(个人理解)

栈也称堆栈,是一种特殊的线性表,只能在表的尾部加入新的元素,称为入栈或压栈(push),也只能在表尾删除元素,称为出栈(pop)。表的尾部为栈顶,头部为栈底。栈这个概念在本学期学的汇编语言程序设计课程中也多次提及,在数据存储上有“先进先出”的原则(就像叠盘子取盘子,永远放的是最上面的一个,取的也是最上面的一个),是存取数据的一个利器,应该善加利用。

二.对于栈的基本操作

1.入栈:使用单链表插入节点的方式来入栈,添加新的元素
2.出栈:弹出栈顶元素
3.得到栈的深度
4.返回栈顶元素
5.输出整个栈的内容
6.判断栈是否为空

目前只想到了这一些,之后再来慢慢补充。

三.实现分析(c++,链表实现)

(一)数据结构的设计分析

1.一个元素(结点):
一个结构体,包含了:

1.储存的数据:T data
2.下一个元素的地址:*pnext

2.整个栈:
一个类,其中包含:

public:
1.构造函数,析构函数
2.入栈:push_elem(T dataipt )
3.出栈:pop_elem()
4.得到栈顶内容:T GetTop() 
5.得到栈的深度:int GetDepth()
6.判断是否为空:bool JudgeEmpty()
private:
1.栈顶的指针
2.深度(长度)计数器

(二)相关的定义以及声明(依然选择用模板来实现)

单个节点:

template<typename T>
class StackNode{
public:
T data;
StackNode<T> *pnext;
};

栈:

template<typename T>
class My_Stack{
public:
 My_Stack();
 ~My_Stack(){}
 void Init_Stack();
 void Push_elem(T dataipt);
 T Pop_elem();
 void Print();
 int GetDepth() const {return depth;}
 T Get_Top();
 bool JudgeEmpty();
private:
 StackNode<T> *Top_Ptr;
 StackNode<T> *Node_Ptr;
 int depth;
};

(三)函数的实现(代码)

template<typename T>
My_Stack<T>::My_Stack()
{
 Init_Stack();
}
template<typename T>
void My_Stack<T>::Init_Stack()
{
 Top_Ptr=NULL;
 this->depth=0;
}//used for initiation

template<typename T>
void My_Stack<T>::Push_elem(T dataipt)
{
 Node_Ptr=Top_Ptr;
 if(Top_Ptr==NULL)
 {
  Top_Ptr=new StackNode<T>;
  Top_Ptr->data=dataipt;
  Top_Ptr->pnext=NULL;
 }
 //judge if the stack is empty!
 else
 {
  Top_Ptr=NULL;
  Top_Ptr=new StackNode<T>;
  Top_Ptr->pnext=Node_Ptr;
  Top_Ptr->data=dataipt;
 }
 depth++;
}//push elements

template<typename T>
T My_Stack<T>::Pop_elem()
{
 T tempdata=Top_Ptr->data;
 if(this->depth==0)std::cout<<"the stack is empty"<<std::endl;
 else if(this->depth==1)
 {
  delete Top_Ptr;
  std::cout<<"pop successful"<<std::endl;
  Top_Ptr=NULL;
  Node_Ptr=NULL;
  depth--;
 }
 else
 {
  delete Top_Ptr;
  Top_Ptr=Node_Ptr;
  if(Node_Ptr->pnext!=NULL)
  {
   Node_Ptr=Node_Ptr->pnext;
  }
  depth--;
  std::cout<<"pop successful"<<std::endl;
 }
 return tempdata;
}//pop the element on the top

template<typename T>
void My_Stack<T>::Print()
{
 StackNode<T> *trav_ptr=Top_Ptr;
 std::cout<<"Top"<<std::endl;
 while(trav_ptr!=NULL)
 {
  std::cout<<"---"<<std::endl;
  std::cout<<trav_ptr->data<<std::endl;
  trav_ptr=trav_ptr->pnext;
 }
 std::cout<<"---"<<std::endl;
 std::cout<<"Bottom"<<std::endl;
}//view on the stack

template<typename T>
T My_Stack<T>::Get_Top()
{
 return *Top_Ptr;
}
template<typename T>
bool My_Stack<T>::JudgeEmpty()
{
 if(Top_Ptr==NULL)return true;
 else return false;
}

(四)测试一下

int main()
{
 My_Stack<int> s1;
 s1.Push_elem(1);
 s1.Push_elem(2);
 s1.Push_elem(3);
 s1.Push_elem(4);
 s1.Push_elem(5);
 s1.Print();
 int i=s1.Pop_elem();
 i=s1.Pop_elem();
 s1.Print();
 return 0;
}

算是成功了吧,下回再贴点相关的题目。

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值