Python实现栈
定义栈类
class Stack ( object ) :
def __init__ ( self) :
self. items = [ ]
def is_Empty ( self) :
return self. items == [ ]
def peek ( self) :
if self. is_Empty( ) :
return None
return self. items[ len ( self. items) - 1 ]
def size ( self) :
return len ( self. items)
def push ( self, item) :
self. items. append( item)
def pop ( self) :
return self. items. pop( )
简单的栈测试
if __name__ == "__main__" :
my_stack = Stack( )
my_stack. push( 'h' )
print ( "压栈:{}" . format ( my_stack. peek( ) ) )
my_stack. push( 'a' )
print ( "压栈:{}" . format ( my_stack. peek( ) ) )
print ( "此时栈大小为:{},栈顶元素为:{}" . format ( my_stack. size( ) , my_stack. peek( ) ) )
print ( "出栈:{}" . format ( my_stack. pop( ) ) )
print ( "栈是否为空:{}" . format ( my_stack. is_Empty( ) ) )
print ( "此时栈大小为:{},栈顶元素为:{}" . format ( my_stack. size( ) , my_stack. peek( ) ) )
print ( "出栈:{}" . format ( my_stack. pop( ) ) )
print ( "栈是否为空:{}" . format ( my_stack. is_Empty( ) ) )
print ( "此时栈大小为:{},栈顶元素为:{}" . format ( my_stack. size( ) , my_stack. peek( ) ) )
print ( "栈是否为空:{}" . format ( my_stack. is_Empty( ) ) )
"""
压栈:h
压栈:a
此时栈大小为:2,栈顶元素为:a
出栈:a
栈是否为空:False
此时栈大小为:1,栈顶元素为:h
出栈:h
栈是否为空:True
此时栈大小为:0,栈顶元素为:None
栈是否为空:True
"""
栈应用——检测字符串中的括号是否成对
def syntaxChecker ( string) :
stack = Stack( )
opens = '([{'
closes = ')]}'
balanced = True
for i in string:
if i in '([{' :
stack. push( i)
elif i in ')]}' :
if stack. is_Empty( ) :
balanced = False
break
else :
j = stack. pop( )
if opens. find( i) != closes. find( j) :
balanced = False
break
if not stack. is_Empty( ) :
balanced = False
return balanced
首先创建一个栈对象,并新建一个包含所有左括号的数组和一个包含所有右括号的数组(注意同种括号下标需要对应),接着讲匹配状态设为True 然后对输入的字符串进行判断
如果匹配到左括号,则压栈 如果匹配到右括号
如果此时栈为空,匹配状态设为False,因为空栈缺少左括号肯定是不匹配 如果栈不为空,则出栈当前的栈顶元素,如果此时符号类型匹配,则确定是一组括号 循环直到无法匹配到括号 最后判断如果栈不为空,则匹配失败,如果匹配成功则匹配状态不做修改仍为True 返回匹配状态
栈应用——十进制转换为二进制
def decimal_to_bin ( dec) :
stack = Stack( )
bin_str = ''
if dec == 0 :
stack. push( 0 )
while dec > 0 :
a = dec % 2
stack. push( a)
dec = int ( dec / 2 )
while not stack. is_Empty( ) :
bin_str += str ( stack. pop( ) )
return bin_str
首先创建一个栈对象,和一个存储二进制数的字符串,函数传入待转换的十进制数 提前判断该数是不是0,如果是0则直接压栈0 非零则开始执行转换操作
将十进制数%2后的结果压入栈 然后将十进制数/2得到新的数 如此循环直到所得十进制数小于一 注意这个过程中为了避免小数所以执行了强制类型转换 循环结束后如果栈不为空,则将之前压栈的元素全部按顺序出栈组成一个二进制的字符串,返回之