1. 栈
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈(Stack)是限制插入和删除操作只能在一个位置进行的表,该位置是表的末端,称为栈的顶(top)。栈的基本操作有PUSH(入栈)和POP(出栈)。栈又被称为LIFO(后入先出)表。
1.1 栈的实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Stack( object ):
def __init__( self ):
self .stack = []
def isEmpty( self ):
return self .stack = = []
def push( self ,item):
self .stack.append(item)
def pop( self ):
if self .isEmpty():
raise IndexError, 'pop from empty stack'
return self .stack.pop()
def peek( self ):
return self .stack[ - 1 ]
def size( self ):
return len ( self .stack)
|
1.2 栈应用
1.2.1 检查程序中成对的符号
程序的语法错误经常是由缺少一个符号造成的。可用栈来检查符号是否成对。做一个空栈,如果字符是开放符号('({[')则将其push栈中。如果符号是个闭合符号(')]}'),则当栈空时报错,对应'()}'的错误。否则,将栈pop,如果弹出的符号不是对应的开放符号,则报错,对应'(}'的错误。文件末尾,如果栈为空,则报错,对应'({}'的错误。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
def match(i,j):
opens = '([{'
closes = ')]}'
return opens.index(i) = = closes.index(j)
def syntaxChecker(string):
stack = Stack()
balanced = True
for i in string:
if i in '([{' :
stack.push(i)
elif i in ')]}' :
if stack.isEmpty():
balanced = False
break
else :
j = stack.pop()
if not match(j,i):
balanced = False
break
if not stack.isEmpty():
balanced = False
return balanced
|
1.2.2 进制转换
十进制转换二进制:把十进制转成二进制一直分解至商数为0。从最底左边数字开始读,之后读右边的数字,从下读到上。
来自《Problem Solving with Algorithms and Data Structures》的图片:
代码:
1
2
3
4
5
6
7
8
9
10
11
|
def decimal_to_bin(dec):
stack = Stack()
cur = dec
while cur> 0 :
a = cur % 2
cur = cur / 2
stack.push(a)
binstr = ''
while not stack.isEmpty():
binstr + = str (stack.pop())
return binstr
|
1.2.3 后缀记法
后缀记法(postfix),使用一个栈,见到一个数时入栈,遇到一个运算符时就作用于从栈弹出的两个元素,将结果弹入栈中。
(7+8)/(3+2)可以写作7 8 + 3 2 + /
来自《Problem Solving with Algorithms and Data Structures》的图片:
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
|
def infixtoPostfix(infix):
a = {}
a[ '*' ] = 3
a[ '/' ] = 3
a[ '+' ] = 2
a[ '-' ] = 2
a[ '(' ] = 1
stack = Stack()
post = ''
for i in infix:
if i not in a and i! = ')' :
post + = i
elif i = = '(' :
stack.push(i)
elif i = = ')' :
top = stack.pop()
while top! = '(' :
post + = top
top = stack.pop()
else :
while not stack.isEmpty() and a[i]< = a[stack.peek()]:
post + = stack.pop()
stack.push(i)
while not stack.isEmpty():
post + = stack.pop()
return post
def postfixExp(postfix):
stack = Stack()
postlist = postfix.split()
for i in postlist:
if i not in '+-*/' :
stack.push(i)
else :
a = stack.pop()
b = stack.pop()
result = math(i,b,a)
stack.push(result)
return stack.pop()
def math(x,y,z):
if x = = '+' :
return float (y) + float (z)
if x = = '-' :
return float (y) - float (z)
if x = = '*' :
return float (y) * float (z)
if x = = '/' :
return float (y) / float (z)
|
2 队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列(queue)也是表,使用队列时插入和删除在不同的端进行。队列的基本操作是Enqueue(入队),在表的末端(rear)插入一个元素,还有出列(Dequeue),删除表开头的元素。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class Queue( object ):
def __init__( self ):
self .queue = []
def isEmpty( self ):
return self .queue = = []
def enqueue( self ,x):
self .queue.append(x)
def dequeue( self ):
if self .queue:
a = self .queue[ 0 ]
self .queue.remove(a)
return a
else :
raise IndexError, 'queue is empty'
def size( self ):
return len ( self .queue)
|
总结
以上就是本文关于Python数据结构之栈、队列的实现代码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
原文链接:http://www.cnblogs.com/linxiyue/p/3556875.html