Python实现栈与队列

一、实现栈的基本操作
1.Stack()创建一个新的空栈。它不需要参数,并返回一个空栈。

2.push(item)将新项添加到堆栈的顶部。它需要参数 item 并且没有返回值。

3.pop()从栈顶删除项目。它不需要参数,返回 item。栈被修改。

4.peek()返回栈顶的项,不删除它。它不需要参数。堆栈不被修改。

5.is_empty()测试看栈是否为空。它不需要参数,返回一个布尔值。

6.size()返回栈的项目数。它不需要参数,返回一个整数。

# -*- coding: utf-8 -*-

'''请在Begin-End之间补充代码, 完成Stack类'''
class Stack():
    # 创建空列表实现栈
    def __init__(self): 
        self.__list = []
  
    # 判断是否为空,输出为True或False
    def is_empty(self): 
        # ********** Begin ********** #
        if len(self.__list):
            return False
        else:
            return True

        # ********** End ********** #   
    # 压栈,添加元素
    def push(self,item): 
        # ********** Begin ********** #
        self.__list.append(item)

        # ********** End ********** #  
    # 弹栈,弹出最后压入栈的元素
    def pop(self): 
        # ********** Begin ********** #
        if self.is_empty():
            return 
        else:
            return self.__list.pop()
        # ********** End ********** #  
    # 栈的长度
    def size(self):
        # ********** Begin ********** #
        return len(self.__list)

        # ********** End ********** #      

if __name__ == "__main__":
    stack = Stack() 
    nums = input().split()
    # 将nums中的元素依次入栈
    for num in nums:
        stack.push(num)
    # 打印栈的长度
    print(stack.size())
    # 将栈中元素依次弹出
    while not stack.is_empty():
        print(stack.pop(), end = ' ')

二、栈应用之括号匹配问题
任务:编写程序检查该字符串的括号是否成对出现。
判断字符串是否有效,即字符串中括号是否成对出现。若是,则输出 True ,否则输出 False 。其中字符串的字符只包含三种括号,花括号{}、中括号[]、圆括号(),即它仅由 (、)、[、]、{、}六个字符组成。

S1:遍历输入的括号序列,如果是左括号,进入S2,如果是右括号,进入S3;

S2:如果当前遍历到左括号,则入栈;

S3:如果当前遍历到右括号,则出栈一个元素,看其是否与当前的右括号组成一对,如果不是,则匹配失败。或者在出栈过程中发生异常(从空栈中出栈),也匹配失败;

S4:若能顺利遍历完成,检查栈中是否还有剩余元素,如果有,则匹配失败;如果没有,则匹配成功。

# -*- coding: utf-8 -*-

class Stack():
    # 创建空列表实现栈
    def __init__(self): 
        self.__list = []  
    # 判断是否为空
    def is_empty(self): 
        return self.__list == []
    # 压栈,添加元素
    def push(self,item): 
        self.__list.append(item)
    # 弹栈,弹出最后压入栈的元素
    def pop(self): 
        if self.is_empty():
            return 
        else:
            return self.__list.pop() 
        
'''请在Begin-End之间补充完成代码, 完成syntaxChecker函数, 解决括号匹配问题'''
def syntaxChecker(strList):
    ### strList: 字符串列表
    stack = Stack()#建立一个实例对象
    left = '([{'     # 左括号
    right = ')]}'    # 右括号
    flag = True      # 标志位
    # ********** Begin ********** #
    flag = 0#创建标志位
    for item in strList:#依次取出元素
        if item in left:#如果元素在left中,进入队列
            stack.push(item)
        if item in right:#如果元素在right中
            if stack.is_empty():#如果此时栈为空,说明括号不匹配,使用break结束
                flag = 1#将标志位定位1
                break
            else:#否则
                j = stack.pop()#将栈中的元素取出并赋值给j
                if left.find(j)!= right.find(item):#如果两个元素值不相同,说明不匹配,结束,如果相同继续进行比较
                    flag = 1
                    break
    if flag == 1 or stack.is_empty()==False:#在栈不为空且flag的值不为1的值,输出True,否则输出False
        print("False")
    else:
        print("True")


    # ********** End ********** # 
    return flag

if __name__ == "__main__":
    strList = input().split()
    result = syntaxChecker(strList)
    #print(result)

三、实现队列的基本操作

![在这里插入图片描述](https://img-blog.csdnimg.cn/9d3af0579a5b4fafabe90b03f5b2608f.png)
抽象数据类型 Queue 由如下操作定义:
抽象数据类型 Queue 由如下操作定义:

Queue():创建一个空队列对象,无需参数,返回空的队列;

enqueue(item):将数据项添加到队尾,无返回值;

dequeue():从队首移除数据项,无需参数,返回值为队首数据项;

is_empty():测试是否为空队列,无需参数,返回值为布尔值;

size():返回队列中的数据项的个数,无需参数。



```python
**# -*- coding: utf-8 -*-

'''请在Begin-End之间补充代码, 完成Queue类'''
class Queue():
    # 创建空列表实现队列
    def __init__(self): 
        self.__list = []   
    # 判断是否为空
    def is_empty(self): 
        # ********** Begin ********** #
        return self.__list == []
        # ********** End ********** # 
    # 从队尾插入
    def enqueue(self,item):
        # ********** Begin ********** #
        self.__list.append(item)
        # ********** End ********** # 
    # 从队首弹出
    def dequeue(self): 
        # ********** Begin ********** #
        j = self.__list[0]
        del(self.__list[0])
        return j
        
 

        # ********** End ********** # 
    # 队列的长度
    def size(self):
        # ********** Begin ********** #
        return len(self.__list)
        # ********** End ********** # 
        
if __name__ == "__main__":
    queue = Queue() 
    nums = input().split()
    # 将nums中的元素依次送入队列
    for num in nums:
        queue.enqueue(num)
    print(queue.size())
    # 将队列中的元素依次弹出
    while not queue.is_empty():
        print(queue.dequeue(), end = ' ')
**

四、使用队列解决约瑟夫环问题
S1:将编号0,…,n−1循环压入队列;

S2:设置一个计数器,保存当前次数;

S3:当队列的长度大于1时,一直进行循环操作 S4;

S4:从队首取一个人出队,如果这个人报数正好是 m 那么就被杀掉,然后下一个人继续从1开始报数。如果不是 m 的话在重新入队,计数器继续 +1。

# -*- coding: utf-8 -*-
class Queue():
    # 创建空列表实现队列
    def __init__(self): 
        self.__list = []   
    # 判断是否为空
    def is_empty(self): 
        return self.__list == []
    # 从队尾插入
    def enqueue(self,item): 
        self.__list.insert(0, item)
    # 从队首弹出
    def dequeue(self):
        if self.is_empty():
            return 
        else:
            return self.__list.pop() 
    # 队列长度
    def size(self): 
        return len(self.__list)
def JosephusSolver(n, m):
    queue = Queue()
    result = []
    # ********** Begin ********** #
    t = 1 # 计数
    # 依次压入队中
    for i in range(n): 
        queue.enqueue(i)
    # 当队列数大于1时,进行循环
    while queue.size() > 1:
        # 当计数满m次时,重置计数器t,弹出队首元素,并保存到result中
        if t == m: 
            x = queue.dequeue() # 弹出x
            result.append(x)
            t = 1
        # 否则,将队首元素重新放到队尾,增加计数次数
        else: 
            x = queue.dequeue()
            queue.enqueue(x)
            t += 1
    # 完成循环后,弹出队列的余下的唯一元素
    x = queue.dequeue() # 弹出x
    result.append(x)
    # ********** End ********** #
    return result
if __name__ == "__main__":    
    n = int(input())
    m = int(input())
    print(JosephusSolver(n,m))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

iWTknow

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

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

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

打赏作者

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

抵扣说明:

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

余额充值