算法:栈、队列、链表

本篇讲述了三种data structure的特点

队列

一串加密后的QQ号是:631758924, 他的解密方法如下:将第一个数删除,将第二个数放到末尾,再将第三个数删除,第四个数放到末尾…到最后删除的数字连在一起就是解密后的结果
用Python实现解密过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
list_input = []
# 输入
while True:
number = input("give me number to input:\n")
if number == 'done':
break
list_input.append(number)
# 被删除的数字
delete = []
while True:
if len(list_input) != 1:
delete.append(list_input[0])
del list_input[0]
list_input.append(list_input[0])
del list_input[0]
else:
delete.append(list_input[0])
del list_input[0]
break

print(delete)

最后输出的结果为:615947283

而书本上用C则更麻烦一点,先初始化一个数组int q[101], 之后在输入的数字前加入数字0,将第一个数字设为head,队尾数字的后一个位置设置为tail。

如果把tail设置为队尾时,当队列中只剩下一个元素的时候,head与tail重合会带来一些麻烦。这里规定队首和队尾重合时,队列为空。

删除一个数:head++;新增加一个数:把需要增加的数放到q[tail],然后tail++。

在这个队列当中,新来的人总是站在队列的最后面,来的越早的人越靠前,也就越早能买到票,就是先来的人先服务,我们称之为“先进先出”(First In First Out)原则。

‘xyzyx’是一个回文字符串,所谓回文字符串就是指正读反读均相同的字符序列。通过栈这个数据结构我们很容易判断一个字符串是否是回文。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
list_input = []
while True:
number = input("give me number to input:\n")
if number == 'done':
break
list_input.append(number)

# 如果长度是3,mid_point则为1
mid_point = int(len(list_input)/2)
for i in range(0,mid_point):
if list_input[i] != list_input[len(list_input)-1-i]:
print("Not a palindrome")
break
elif i == mid_point-1:
print("A palindrome")

在书本中,为了突出栈的特点,即后进后出(比如吃薯片时,要想吃掉最后一片,必须把全面的全部吃完),作者创建了一个字符数组来当作栈,再将测试的回文中的前一半存入栈中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
top = 0; //栈的初始化
for (i=0;i<=mid;i++)
{
s[++top] = a[i];
}```

随后再将后一半的字符与栈中的字符一一进行比对:
```C
for(i=next;i<=len-1;i++>)
{
if(a[i] != s[top])
break;
top--;
}

因为一开始每入栈一个字符top就会加一,所以中间字符的左边,即s[top],不出意外地会与中间字符的右边a[i]呈现出一样的字符。一旦top=0,则意味着栈中所有的字符都已经输出完毕,测试的字符确实是回文。

  • Copyrights © 2020-2024 Yangyang Cui

请我喝杯咖啡吧~

支付宝
微信