Python描述数据结构之顺序栈篇

前言

  本篇章主要介绍栈里的栈及顺序栈,并用Python实现顺序栈的基本操作。

1. 栈

  栈 ( S t a c k ) (Stack) (Stack),是一种操作受限的线性表,只允许在一端进行插入或删除操作的线性表。

在这里插入图片描述
  栈顶:允许进行插入或删除操作的那一端。

  栈底:不允许进行插入或删除操作的那一端。
  栈是后进先出 ( L a s t (Last (Last I n In In F i r s t First First O u t , L I F O ) Out,LIFO) Out,LIFO),即假设某个栈 S = ( a 1 , a 2 , a 3 ) S=(a_1,a_2,a_3) S=(a1,a2,a3),进栈顺序为 a 1 , a 2 , a 3 a_1,a_2,a_3 a1,a2,a3,出栈顺序为 a 3 , a 2 , a 1 a_3,a_2,a_1 a3,a2,a1
  另外,栈还有一个很重要的数学性质: n n n个不同元素进栈,出栈元素不同排列的个数为 1 n + 1 C 2 n n \frac {1} {n+1}C_{2n}^n n+11C2nn,又称为卡特兰数。

2. 顺序栈

  顺序栈是利用一组地址连续的存储单元来存放自栈底到栈顶的数据元素,同时带有一个top指针来指示当前栈顶的位置。
  栈顶指针top:初始时设置为 − 1 -1 1

  入栈操作:栈顶指针先加1,再将值送入栈顶元素。

  出栈操作:先取栈顶元素,再将栈顶指针减1。

  栈空条件 t o p = = − 1 top==-1 top==1

  栈满条件 t o p = = M a x S i z e − 1 top==MaxSize-1 top==MaxSize1

  栈长 t o p + 1 top+1 top+1

  具体操作时,可以按照列表的方式进行操作。

3. 基本功能

操作名称操作说明
CreateSequenceStack(val_list)创建顺序栈
IsEmpty()判断顺序栈是否为空
LengthStack()返回顺序栈的长度
Traverse()打印出顺序栈里的数据元素
Push(data)入栈
Pop()出栈
GetTop()取栈顶元素

4. 代码实现

class SequenceStack(object):
    def __init__(self):
        self.MaxStackSize = 10
        self.S = [None for i in range(self.MaxStackSize)]
        self.top = -1

    def CreateSequenceStack(self, val_list):
        """
        将列表转换成一个顺序栈
        :param val_list: 
        :return: 
        """
        for val in val_list:
            s1.Push(val)

    def IsEmpty(self):
        """
        判空
        :return: 
        """
        if self.top == -1:
            return True
        else:
            return False

    def LengthStack(self):
        """
        返回顺序栈的长度
        :return: 
        """
        return self.top + 1

    def Traverse(self):
        """
        遍历顺序栈
        :return: 
        """
        if self.IsEmpty():
            print('栈为空!')
        else:
            for index in range(self.top + 1):
                print(self.S[index], end=' ')
        print('')

    def Push(self, e):
        """
        入栈
        :param e: 
        :return: 
        """
        if self.top < self.MaxStackSize - 1:
            self.top += 1
            self.S[self.top] = e
        else:
            print('栈已满!')

    def Pop(self):
        """
        出栈
        :return: 
        """
        if self.top == -1:
            print('栈为空!')
            return -1
        else:
            e = self.S[self.top]
            self.top -= 1
            return e

    def GetTop(self):
        """
        取栈顶元素
        :return: 
        """
        if self.top == -1:
            print('栈为空!')
            return -1
        else:
            return self.S[self.top]

  测试程序如下:

if __name__ == '__main__':
    s1 = SequenceStack()
    s1.CreateSequenceStack([1, 3, 5, 7, 9])
    print('打印顺序栈s1: ', end='')
    s1.Traverse()
    print('顺序栈s1的长度为: %d' % s1.LengthStack())
    print('顺序栈s1的栈顶元素为: %d' % s1.GetTop())
    print('s1出栈: ', end='')
    for i in range(s1.LengthStack()):
        print(s1.Pop(), end=' ')

  运行结果如下:

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏小悠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值