本文采用python作为编程语言
什么是栈:栈是一种线性数据结构,遵循Last in First out(后进先出)原则。
栈的代码实现(以-1为栈顶):
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[-1]
def size(self):
return len(self.items)
栈的运用:
1.简单的括号匹配:()这是一对正确的圆括号,(()))这是一对不正确的圆括号,如何利用算法实现判断这对括号是否正确。
思路:每一个右括号必定有一个左括号相对应,利用栈的后进先出可以完美的解决这个问题,扫描案例时,遇到左括号就压入栈,遇到右括号就将栈内左括号删除,扫描完成后栈内为空则返回True,栈内还存在左括号或扫描过程遇到右括号时栈内为空则返回False
代码实现:
from Stack import Stack
def parCheck(text):
s = Stack()
balance = True
index = 0
while index < len(text) and balance: #遍历案例
symbol = text[index]
if symbol == "(": #扫描到左括号,压入栈
s.push(symbol)
else:
if s.isEmpty(): #扫描到右括号但是栈内为空,匹配失败
balance = False
else:
s.pop() #栈内删除左括号
index += 1
if balance and s.isEmpty(): #扫描结束,栈内为空,匹配成功
return True
else:
return False
print(parCheck('((('))
进阶思考:如何同时匹配花括号,圆括号和方括号
2.十进制转化为二进制:一个十进制的数字,如233,利用算法将其转化为二进制的数字11101001
思路:233是2*10^2+3*10^1+3*10^0,11101001是1*2^7+1*2^6+1*2^5+0*2^4+1*2^3+0*2^2+0*2^1+1*2^0=233,二者相等,所以我们采用除二求余数法。但得到余数是从小到大排序,而我们需要输出是从大到小的输出,所以就可以用到栈的方法。
代码实现:
def change(text):
ans = Stack()
while text > 0:
ans.push(text%2) #求余数
text = text // 2 #求整数
answer = '' #准备空字符集接收数据,用来返回二进制数字
while not ans.isEmpty():
answer += str(ans.pop()) #利用栈的弹出,从大到小输出
return int(answer)
进阶思考:其实无论是2进制还是8进制还是16进制,都可以采用除n求余数法,只需记住输出与输入次序相反,需要栈来实现