数据结构 链栈基本操作(C++)

1、链栈

采用链式存储结构实现的栈,与单链表相同,区别在于链栈只在链表头进行操作。(无头结点)

在应用程序无法预先估计栈最大容量时,应该使用链栈。

数据结构 链栈基本操作(C++)_第1张图片

链表的头指针就是栈顶

不需要头结点
基本不存在栈满的情况

空栈相当于头指针指向空

插入和删除仅在栈顶处执行

2、链栈存储结构 

typedef struct StackNode {
   SElemType data;
   struct StackNode *next;
} StackNode, *LinkStack;

3、链栈初始化

*注意,链栈无头结点

Status InitStack(LinkStack &s)   // 构造一个空栈 S,栈顶指针置空
{
   s = NULL;
   return OK;
}

4、判断空栈

bool StackEmpty(LinkStack s)
{
    if(s==NULL) return 1;
    return 0;
}

5、输出链栈

void PrintStack(LinkStack s)
{
   for(LinkStack p = s; p; p = p->next) {
      cout << p->data;
      if(p->next)
         cout << ' ';
   }
   cout << endl;
}

6、销毁栈

void DestroyStack(LinkStack &s)
{
   LinkStack next;
   while(s){
      next = s->next;
      delete s;
      s =  next;
   }
}

7、入栈
1、为入栈元素e分配空间,用指针p指向,将新节点数据域置为e。
2、将新节点插入栈顶。
3、修改栈顶指针为p。

Status Push(LinkStack &s, SElemType e)  //在栈顶插入元素e
{
    LinkStack p;
    p =new StackNode;
    p->data = e;
    p->next = s;
    s=p;
    return OK;
}

8、出栈
1、判断栈是否为空,若空则返回ERROR。

2、将栈顶元素赋给e。临时保存栈顶元素的空间,以备释放。

3、修改栈顶指针,指向新的栈顶元素。

4、释放原栈顶元素的空间。

Status Pop(LinkStack &s, SElemType &e)  //删除S的栈顶元素,用e返回其值
{
    if (s==NULL) return ERROR;
    e=s->data;
    LinkStack p;
    p = new StackNode;
    p = s;
    s = s->next;
    delete p;
    return OK;
}

9、取栈顶元素

SElemType GetTop(LinkStack s)  //返回S的栈顶元素,不修改栈顶指针
{
    if (s!=NULL) return s->data;
}

你可能感兴趣的:(数据结构,数据结构)