线性表、栈与队列

《大话数据结构》

线性表

基础知识

线性表:零个或多个数据元素的有限序列。关键词:序列,有限。
元素个数定义为线性表的长度,n=0时成为空表。
在较复杂的线性表中,一个数据元素可以由若干个数据项组成。
线性表的一些基本操作:初始化建立空的线性表,判断是否为空,清空,取出第i个值,查找与给定值相同的值的位置,加入新元素,删除第i个元素,返回元素个数。
对于复杂的操作,就是将基本操作组合起来。

存储

顺序存储

用一段地址连续的存储单元依次存储线性表的数据元素。
可以用C预言的一维数组来实现顺序存储结构。
顺序存储的三个属性:起始位置,最大存储容量,当前长度。
地址计算方法,随机存取结构
顺序存储中的操作:
(1)读取,直接取出第i个值即可
(2)插入,插入位置不合理或者本身的长度已经大于等于数组长度则抛出异常,其余情况,向后移动一部分数据将新数据插入第i个位置。
删除元素:如果删除位置不合理,抛出异常;取出删除元素,从删除位置开始遍历到最后一个位置,分别将它们都向前移动一个位置。表长减一。
对于顺序存储结构,存读数据时,时间复杂度都是O(1),而插入和删除时,时间复杂度是O(n)(是平均复杂度(n-1)/2化简得到)。
顺序存储的优点:无需为表示表中元素之间的逻辑关系而增加额外的存储空间,可以快速的存取表中任意位置的元素。
缺点:插入和删除操作需要移动大量元素,当线性表长度变化较大时,难以确定存储空间的容量。造成存储空间的碎片。

链式存储

存储数据元素信息的域成为数据域,存储直接后继位置的域成为指针域,指针域中的信息成为指针或者链。这两部分的信息元素的存储映像成为结点(node)。
n个结点链接成一个链表,即为线性表就的链式存储结构。此链表的每个结点只包含一个指针域,所以叫单链表。单链表通过每个结点的指针域将线性表的数据元素按其逻辑次序链接在一起。
链表中第一个结点的存储位置叫头指针,最后一个结点指针为“空”(NULL)。
头结点与头指针。
头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。头指针具有标识作用,所以常用头指针冠以链表的名字,无论链表是否为空,头指针均不为空。头指针是链表的必要元素。
头结点是为了操作的同意和方便而设立的,放在第一元素的结点之前,其数据域一般无意义(也可存放链表的长度),有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其他结点的操作就统一了。头结点不一定是链表的必要因素。

### 线性表队列相关的数据结构知识及算法题 #### 1. 线性表基础知识 线性表是一种基本的数据结构,其元素之间具有一对一的线性关系。线性表可以分为顺序和链两种存储方式[^2]。 - **顺序**:通过数组实现,支持随机访问,插入和删除操作效率较低。 - **链**:通过指针连接节点实现,不支持随机访问,但插入和删除操作效率较高。 ```python # 顺序实现 class SeqList: def __init__(self, size): self.data = [None] * size self.length = 0 def insert(self, index, value): if self.length == len(self.data): return False for i in range(self.length, index, -1): self.data[i] = self.data[i - 1] self.data[index] = value self.length += 1 return True ``` #### 2. 的基本概念实现 是一种后进先出(LIFO)的数据结构,支持两种基本操作:入(push)和出(pop)。可以通过数组或链实现[^1]。 ```python # 的数组实现 class Stack: def __init__(self, capacity): self.arr = [0] * capacity self.top = -1 self.capacity = capacity def push(self, value): if self.top == self.capacity - 1: return False self.top += 1 self.arr[self.top] = value return True def pop(self): if self.top == -1: return None value = self.arr[self.top] self.top -= 1 return value ``` #### 3. 队列的基本概念实现 队列是一种先进先出(FIFO)的数据结构,支持两种基本操作:入队(enqueue)和出队(dequeue)。队列可以通过数组或链实现,循环队列是常见的优化形式[^4]。 ```python # 循环队列的数组实现 class Queue: def __init__(self, capacity): self.front = 0 self.rear = 0 self.capacity = capacity self.queue = [None] * capacity def enqueue(self, value): if (self.rear + 1) % self.capacity == self.front: return False self.queue[self.rear] = value self.rear = (self.rear + 1) % self.capacity return True def dequeue(self): if self.front == self.rear: return None value = self.queue[self.front] self.front = (self.front + 1) % self.capacity return value ``` #### 4. 队列的算法题 ##### 4.1 有效的括号 给定一个只包含 `'('` 和 `')'` 的字符串,判断括号是否有效。 ```python def is_valid_parentheses(s): stack = [] for char in s: if char == '(': stack.append(char) elif char == ')': if not stack: return False stack.pop() return not stack ``` ##### 4.2 用队列实现 使用队列实现的 `push` 和 `pop` 操作。 ```python class MyStack: def __init__(self): self.queue1 = [] self.queue2 = [] def push(self, x): self.queue1.append(x) def pop(self): while len(self.queue1) > 1: self.queue2.append(self.queue1.pop(0)) result = self.queue1.pop(0) self.queue1, self.queue2 = self.queue2, self.queue1 return result ``` ##### 4.3 用实现队列 使用实现队列的 `enqueue` 和 `dequeue` 操作。 ```python class MyQueue: def __init__(self): self.stack1 = [] self.stack2 = [] def enqueue(self, x): self.stack1.append(x) def dequeue(self): if not self.stack2: while self.stack1: self.stack2.append(self.stack1.pop()) return self.stack2.pop() if self.stack2 else None ``` ##### 4.4 设计循环队列 设计一个支持所有队列操作的循环队列。 ```python class CircularQueue: def __init__(self, capacity): self.queue = [None] * capacity self.head = 0 self.tail = 0 self.size = 0 self.capacity = capacity def enqueue(self, value): if self.size == self.capacity: return False self.queue[self.tail] = value self.tail = (self.tail + 1) % self.capacity self.size += 1 return True def dequeue(self): if self.size == 0: return None value = self.queue[self.head] self.head = (self.head + 1) % self.capacity self.size -= 1 return value ``` ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值