'''
Python使用list实现:顺序栈(array_stack)检查括号
参考:《Python数据结构之栈详解》
https://www.jb51.net/article/239930.htm
基本操作:
1. __itit__(): 初始化栈
创建一个空栈
2. size(): 求取并返回栈中所含元素的个数 n
若栈为空,则返回整数0
3. isempty(): 判断是否为空栈
判断栈中是否存储元素
4. push(data): 入栈
将元素 data 插入栈顶
5. pop(): 出栈
删除并返回栈顶元素
4. peek(): 取栈顶元素
返回栈顶元素值,但并不删除元素
'''
class array_stack:
def __init__(self, max_size=10):
self.__max_size = max_size
self.__stack = self.__max_size * [None]
self.__top = -1
def size(self):
return self.__top + 1
def isempty(self):
return self.size() == 0
def isfully(self):
return self.size() == self.__max_size
def __resize(self):
new_size = 2 * self.__max_size
new_stack = [None] * new_size
for i in range(self.size()):
new_stack[i] = self.__stack[i]
self.__stack = new_stack
self.__max_size = new_size
def push(self, data):
if self.isfully():
self.__resize()
self.__top += 1
self.__stack[self.__top] = data
def pop(self):
if self.isempty():
raise IndexError('Stack Underflow!')
else:
result = self.__stack[self.__top]
self.__top -= 1
return result
def peek(self):
if self.isempty():
raise IndexError('Stack Underflow!')
else:
return self.__stack[self.__top]
# 初始化一个最大长度为4的栈
s = array_stack(4)
print('栈空?', s.isempty())
for i in range(4):
print('入栈元素:', i)
s.push(i)
print('栈满?', s.isfully())
print('栈顶元素:', s.peek())
print('栈长度为:', s.size())
while not s.isempty():
print('出栈元素:', s.pop())
print('--------------------------------')
'''
假设表达式中允许包含3种括号()[]{},其嵌套顺序是任意的.
例如:
{()[()]},[{({})}]这样的格式是正确的.
[。),[()),(()}这样的格式是不正确的.
编写一个函数,判断一个表达式字符串,括号匹配是否正确
'''
left=list('([{')
right=list(')]}')
op=list('{()[()]}')
tip=[' ']*len(op)
ok=True
stack = array_stack(len(op))
for i,it in enumerate(op):
if it in left:
stack.push(it)
elif it in right:
if stack.size()==0:
print(f'err:{it}缺少左括弧')
tip[i]='↑'
print(''.join(op))
print(''.join(tip))
ok = False
break
cl = stack.pop()
if left.index(cl)!=right.index(it):
print(f"err:'{cl}'与'{it}',左右括弧不匹配")
tip[i]='↑'
print(''.join(op))
print(''.join(tip))
ok = False
break
if ok:
if stack.size() == 0:
print('ok')
else:
s=''
while not stack.isempty():
s+=f'{stack.pop()}'
print(f"err:'{s}',缺少右括弧")