当前位置:   article > 正文

链栈的介绍与实现_链栈为什么便于多个栈共享存储空间

链栈为什么便于多个栈共享存储空间

1 链栈定义

链栈:采用链式存储的栈称为链栈

在一个链栈中,栈底就是链表的最后一个结点,而栈顶总是链表的第一个结点。因此,新入栈的元素即为链表新的第一个结点,只要系统还有存储空间,就不会有栈满的情况发生。
在这里插入图片描述

链栈的优点在于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况,通常采用单链表实现,并规定所有操作都是在单链表的表头进行的。

2 链栈基本操作

  1. 初始化链栈
void InitStack(LinkStack*s)
{
	*s=(LinkSNode*)malloc(sizeof(LinkSNode));
   (*s)->next=NULL}
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 判断栈空
int LinkStackEmpty(LinkStack*S)
{
	return S->top==NULL}
  • 1
  • 2
  • 3
  • 4
  1. 入栈操作
void Push(LinkStack s,int e)
{
	LinkStack p=(LinkStack)malloc(sizeof(LinkSNode));
	p->data=e;
	p->next=s->next;
	s->next=p;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

将要入栈的元素构造结点p,然后将其插入到栈顶指针s之后,让s始终指向新插入的结点(保证s永远是栈顶指针)

  1. 出栈操作
int Pop(LinkStack s,int*e)
{
	LinkStack p;
	if(EmptyStack(s))return ERROR;
	p=S->next;
	*e=p->data;
	s->next=p->next;
	free(p);
	return OK;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 入出都要保证s永远是栈顶指针
  • 所有栈(队列)的操作,都要注意入栈(队)判满,出栈(队)判空的检查
  • 是否为满,满时不进,是否为空,空时不出
  1. 取栈顶元素
int Get Top(LinkStack s,int*e)
{
	if(EmptyStack(s))return ERROR;
	*e=s->next->data;
	return OK;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3 链栈代码实现

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;         // 特殊的线性表,只有在栈顶一端进行插入删除
typedef struct node {
    ElementType data;
    struct node *Next;
} *Stack;

Stack InitStack(void)
{
    Stack s = (Stack)malloc(sizeof(struct node));
    s->data = 0;
    s->Next = NULL;
}

void Push(Stack s, ElementType e)     //保证S永远是栈顶指针
{
    Stack p = (Stack)malloc(sizeof(struct node));
    p->data = e;
    p->Next = s->Next;
    s->Next = p;
}

void Pop(Stack s, ElementType *e)       //保证S永远是栈顶指针
{
    if (s->Next == NULL) {
        return;
    }
    Stack p = s->Next;
    *e = p->data;
    s->Next = p->Next;
    free(p);
}

void PrtStack(Stack s)
{
    Stack p = s->Next;
    while (p) {
        printf("%d ", p->data);
        p = p->Next;
    }
    printf("\n");
}

int main(void)
{
    ElementType e;
    Stack s = InitStack();

    printf("please input a element :");
    scanf("%d", &e);
    Push(s, e);
    PrtStack(s);

    Pop(s, &e);
    printf("Pop a element : %d ", e);

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/905947
推荐阅读
相关标签
  

闽ICP备14008679号