数据结构之栈

定义

栈(Stack)是一种后进先出(LIFO,Last In First Out)的线性表,一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。。栈的基本操作有:入栈(push)、出栈(pop)、查看栈顶元素(top)等。

栈的实现

栈的实现方式共有三种:

  1. 数组实现:使用一组连续的内存空间来存储栈中的元素,栈顶指针指向栈顶元素的下一个位置。入栈时,将新元素存储在栈顶指针的下一个位置;出栈时,将栈顶元素移动到栈顶指针的位置,并释放该空间。
  2. 链表实现:使用一组节点来存储栈中的元素,每个节点包含一个数据域和一个指向下一个节点的指针。入栈时,将新元素添加到链表尾部;出栈时,将栈顶元素从链表中移除,并更新栈顶指针。
  3. 递归实现:利用递归的方式实现栈的操作,如push和pop。这种实现方式较为简洁,但效率较低。

以下只展示链表实现

class Node:
    def __init__(self,elem,next=None):
        self.elem = elem
        self.next = next


class  Stack:
    def __init__(self):
        self.top = None
        self._len = 0

    @property
    def len(self):
        return self._len


    def push(self,elem):
        p = Node(elem)
        if self.top is None:
            self.top = p
        else:
            p.next = self.top
            self.top= p

        self._len += 1

    def pop(self):
        if self._len:
            current_p = self.top
            for i in range(self._len-1):
                current_p = current_p.next
            elem = current_p.next.elem
            current_p.next = None
            return elem
        else:
            print("Stack is empty")

    def display(self):
        stack = []
        if self._len:
            current_p = self.top
            for i in range(self._len):
                print(current_p.__dict__)
                stack.append(current_p.elem)
                current_p = current_p.next
        print(f"stack:{stack}")
        return stack

    def is_empty(self):
        return bool(self._len)

    def __len__(self):
        return self._len

stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
stack.push(4)
stack.display()

应用场景

历史记录的回退

1、浏览器浏览的回退
网络浏览器将最近浏览的网址存放在一个栈中。每当用户访问者访问一个新网站时,这个新网站的网址就被压入栈顶。这样,每当我们在浏览器单击“后退”按钮时(或者按键盘快捷键 CTRL+Z ,大部分撤销快捷键),就可以弹出当前最近一次访问的网址,以回到其先前访问的浏览状态。

2、文本编辑的撤销

文本编辑器通常会提供一个“撤销”机制以取消最近的编辑操作并返回到先前状态。这个撤销操作也是通过将文本的变化状态保存在一个栈中得以实现。

3、回溯(玩游戏,寻找路径,穷举搜索)

内存管理

一些高级语言的内存管理,JVM 的栈、Python 栈还用于内存管理、嵌套语言特性的运行时环境等

算法

汉诺塔、树形遍历、直方图问题,也用于图算法,如拓扑排序

语法处理:

参数和局部变量的空间是用堆栈在内部创建的。
编译器对大括号匹配的语法检查
对递归的支持
在编译器中像后缀或前缀一样的表达式

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的数据结构顺序栈是一种使用数组来实现的栈结构。顺序栈的特点是先进后出,即最后进入的元素最先出栈。顺序栈可以通过数组的下标来实现元素的进栈和出栈操作。 在C语言中,可以通过定义一个数组和一个栈顶指针来实现顺序栈。栈顶指针指向栈中最后一个元素的位置。当栈为空时,栈顶指针指向-1。 以下是一种实现顺序栈的代码示例: ```c #define MAX_SIZE 100 // 定义栈的最大容量 typedef struct { int data[MAX_SIZE]; // 用数组存储栈元素 int top; // 栈顶指针 } SeqStack; void InitStack(SeqStack *s) { s->top = -1; // 初始化栈顶指针为-1,表示栈为空 } int IsEmpty(SeqStack *s) { return s->top == -1; // 判断栈是否为空 } int IsFull(SeqStack *s) { return s->top == MAX_SIZE - 1; // 判断栈是否已满 } void Push(SeqStack *s, int element) { if (IsFull(s)) { printf("Stack is full.\n"); // 栈已满,无法继续入栈 return; } s->top++; // 栈顶指针加1 s->data[s->top = element; // 元素入栈 } int Pop(SeqStack *s) { if (IsEmpty(s)) { printf("Stack is empty.\n"); // 栈为空,无法进行出栈操作 return -1; } int element = s->data[s->top]; // 获取栈顶元素 s->top--; // 栈顶指针减1 return element; } int GetTop(SeqStack *s) { if (IsEmpty(s)) { printf("Stack is empty.\n"); // 栈为空,无法获取栈顶元素 return -1; } return s->data[s->top]; // 返回栈顶元素 } ``` 以上是一个简单的C语言实现顺序栈的代码示例。通过调用相应的函数,可以实现顺序栈的初始化、判断栈是否为空、判断栈是否已满、元素入栈、元素出栈、获取栈顶元素等操作。需要注意的是,在使用顺序栈时,需要注意栈的容量是否足够,以避免栈溢出的情况发生。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值