链栈

栈也可以用链式存储方式实现。一般链栈用单链表表示,其结点结构与单链表的结构相同,即结点为:

typedef int DataType;                  //这里以整型为栈的数据类型
class StackNode                        //定义链栈的结点
{
public:
          DataType data;
          StackNode *next;
          StackNode()
          { next=NULL;
          };
}
因为栈中的主要运算是在栈顶进行插入和删除操作,显然在单链表的表头插入和删除都比较方便(请读者考虑用单链表的表尾作为栈顶会怎么样),因此以其作为栈顶,而且没有必要像单链表那样为了运算方便而附加一个头结点。
链栈的类描述如下。

class LinkStack
{
private:
          StackNode *top;
public:
          LinkStack()
          {  top=NULL;                         //构造一个新的空栈
          };LinkStack()                         //销毁一个已存在的栈
          {  StackNode *p;
              while(top)                        //销毁栈中所有元素
                {  p=top;
                  top=top->next;
                  delete p;
                }
              top=NULL;                        //栈顶指针赋空表示为空栈
          };
          int Empty_Stack();                    //判断栈是否为空
          int Push_Stack(DataType e);           //将元素e插入栈顶
          int Pop_Stack(DataType &e);           //从栈顶删除一个元素到e中返回
          int GetTop_Stack(DataType &e);        //从栈顶取出一个元素到e中返回
};                                             //链栈类
链栈的成员函数的实现具体步骤如下。
(1)判断栈是否为空
算法思想:判断top是否为空,为空则为空栈,返回1,否则返回0。
具体算法如下。
int LinkStack::Empty_Stack()               //判断链栈是否为空
{
    return(! top);
}2)入栈操作
入栈操作是在栈的顶部进行插入操作,相当于在单链表的表头(第一个元素之前)插入一个新元素。
算法思想:首先为链栈分配空间,若成功,将入栈元素赋值到申请的链栈结点,并插入栈顶,使其成为栈顶元素,成功返回1;否则失败,返回0。
具体算法如下。

int LinkStack::Push_Stack(DataType e)      //链栈入栈操作
{  StackNode *p=new StackNode;              //申请结点
  if(p)                                   //申请结点成功
{  p->data=e;
    p->next=top;
    top=p;                                  //修改栈顶指针
    return 1;
}
else
    return 0;
}3)出栈操作
出栈操作是在栈的顶部进行删除操作,相当于删除单链表的第一个元素。
算法思想:首先判断栈是否为空,若非空,则取出栈顶元素,以引用参数e返回,并删除这个结点,成功返回1;否则,失败返回0。
具体算法如下。

int LinkStack::Pop_Stack(DataType &e)      //链栈出栈操作
{  StackNode *p;
    if(top)
    {  p=top;
      e=p->data;
      top=top->next;                      //修改栈顶指针
      delete p;                           //删除结点
      return 1;
    }
    else
      return 0;
}4)取栈顶元素操作
取栈顶元素是获取出栈顶元素的值,而不改变栈。
算法思想:首先判断栈是否为空,若非空,则取出栈顶元素,以引用参数e返回,成功返回1;否则,失败返回0。(与出栈操作的不同在于不删除结点。)
int LinkStack::GetTop_Stack(DataType &e)   //链栈取栈顶元素
{ if(top)
    {  e=top->data;
      return 1;
    }
    else
      return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值