栈(Stack)是只允许在一端进行插入或删除操作的线性表。
只能在栈顶进行删除与插入的工作,
假设某个栈S={a1,a2, … ,an},如上图所示,则a1为栈底元素,an为栈顶元素。由于只能在栈顶进行插入和删除操作,故进栈顺序为a1,a2, … ,an,出栈顺序为an, … ,a2,a1。故栈的操作特性是后进先出LIFO(Last In First Out),称为后进先出的线性表。(这个结构可以提高cpu的缓存利用率)。一般有两种栈
顺序栈:用一组地址连续的存储单元存放自栈底到栈顶的元素,
同时附设一个指针(top)指示当前栈顶的位置
#define MaxSize 100 //定义栈中元素的最大个数
typedef struct SqStack{
int data[MaxSize]; //存放栈中的元素
int top; //栈顶指针
}SqStack;
链栈:用单链表实现
typedef struct LinkNode{
int data; //数据域
struct LinkNode *next; //指针域
}*LiStack; //栈类型定义
- 基本操作包括:
- 初始化InitStack(&S);
- 判空Empty(S);
- 进栈Push(&S, x);
- 出栈Pop(&S, &x);
- 读栈顶元素GetTop(S);
- 遍历栈PrintStack(&S);
- 销毁栈DestroyStack(&S);
python实现栈:
class Stack:
def init(self):
self.stack = [] # 使用列表来存储栈的元素
def is_empty(self):
return len(self.stack) == 0 # 判断栈是否为空
def push(self, item):
self.stack.append(item) # 将元素压入栈中
def pop(self):
if not self.is_empty():
return self.stack.pop() # 弹出栈顶元素
else:
return None # 若栈为空,则返回None
def get_top(self):
if not self.is_empty():
return self.stack[-1] # 返回栈顶元素,但不弹出
else:
return None # 若栈为空,则返回None
def print_stack(self):
print(self.stack) # 打印栈元素
def destroy(self):
self.stack = [] # 清空栈,销毁栈对象
初始化栈
def init_stack():
return Stack()
判断栈是否为空
def is_empty(stack):
return stack.is_empty()
进栈
def push(stack, item):
stack.push(item)
出栈
def pop(stack):
return stack.pop()
读栈顶元素
def get_top(stack):
return stack.get_top()
遍历栈
def print_stack(stack):
stack.print_stack()
销毁栈
def destroy_stack(stack):
stack.destroy()
示例使用
stack = init_stack()
print(is_empty(stack)) # 输出True
push(stack, 'A')
push(stack, 'B')
push(stack, 'C')
print(is_empty(stack)) # 输出False
print(get_top(stack)) # 输出C
print_stack(stack) # 输出['A', 'B', 'C']
pop(stack)
print_stack(stack) # 输出['A', 'B']
destroy_stack(stack)
print(is_empty(stack)) # 输出True
力扣题一般是创建新栈类,根据要求创建新函数,新函数实现新功能