题目要求:
判断给出的字符串中的括号是否合理,若合理,将括号里面的括号删除,其他内容不变,并返回
# -*- coding: utf8 -*-
class manager(object):
def __init__(self):
self.symbols_location = list()
self.symbols_count = list()
def islegal(self, s):
'''
判断给出的字符串中括号是否合法
:param s: 字符串
:return: True or False
'''
SYMBOLS = {'}': '{', ']': '[', ')': '('}
SYMBOLS_L, SYMBOLS_R = SYMBOLS.values(), SYMBOLS.keys()
arr = []
for c in s:
if c in SYMBOLS_L:
# 左符号入栈
arr.append(c)
elif c in SYMBOLS_R:
# 右符号要么出栈,要么匹配失败
if arr and arr[-1] == SYMBOLS[c]:
arr.pop()
else:
return False
return not arr
def check_symbol_location(self, str):
'''
检查出所有左括号和右括号的位置
左括号计数加1,右括号计算减一,将每次的计数都记录下来,[1, 0]表示刚好出现了成对括号()
:param str: 给出的字符串
:return:
'''
count = 0
for i in range(len(str)):
if str[i] == '(':
self.symbols_location.append(i)
count += 1
self.symbols_count.append(count)
elif str[i] == ')':
self.symbols_location.append(i)
count -= 1
self.symbols_count.append(count)
def symbol_clear_index(self):
'''
遍历括号计算列表,若括号为包含关系时,列表中连续2个值一定是左边的值大于右边的值,且右边的值不等于0
:return: 找出括号包含关系时,子括号在字符串中的索引位置
'''
for i in range(len(self.symbols_count)-1):
if self.symbols_count[i] > self.symbols_count[i+1] and self.symbols_count[i+1]:
index = [self.symbols_location[i], self.symbols_location[i+1]]
del self.symbols_location[i]
del self.symbols_location[i]
del self.symbols_count[i]
del self.symbols_count[i]
return index
def data_manager(self, str):
if self.islegal(str):
s = ''
all_del_symbol = list()
self.check_symbol_location(str)
symbol_index = self.symbol_clear_index()
while symbol_index:
# 循环判断返回的值,若为真,再次调用symbol_clear_index(),直到返回的索引为空
all_del_symbol.extend(symbol_index)
# 将每次返回的需要删除的括号在字符串中的索引位置记录下来
symbol_index = self.symbol_clear_index()
for k, v in enumerate(str):
# 遍历字符串的位置k和值v,将不在需要删除列表中的值记录下来
if k not in all_del_symbol:
s += v
return '整理后结果为: %s'%s
else:
return '该字符串的括号不合法'
if __name__ == "__main__":
manager = manager()
print(manager.data_manager("1 - 2*(17-(60-30+(-40*2/5)*9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2)"))
print(manager.data_manager("1 - 2*(17-(60-30+(-40*(2)/5)*9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2)"))
print(manager.data_manager("1 - 2*(17-60)-30+(-40*2/"))
返回结果如下:
整理后结果为: 1 - 2*(17-60-30+-40*2/5*9-2*5/3+7/3*99/4*2998+10*568/14)-(-4*3)/(16-3*2)
整理后结果为: 1 - 2*(17-60-30+-40*2/5*9-2*5/3+7/3*99/4*2998+10*568/14)-(-4*3)/(16-3*2)
该字符串的括号不合法