栈与队列的原理

栈(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

力扣题一般是创建新栈类,根据要求创建新函数,新函数实现新功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值