栈的基本原理

1.定义

栈是只允许在一端进行插入或删除操作的线性表

栈顶:线性表允许进行插入删除的那一端。

栈底:固定的,不允许进行插入和删除的另一端。

空栈:不含任何的元素。

特性后进先出,先进后出

栈的数学性质:n个不同元素进栈,出栈元素不同排列的个数为 (1/n+1 乘以c\binom{n}{2n})上述公式称为卡特兰数。

栈的顺序存储结构

栈是一种操作受限的线性表,类似于线性表,它也有对应的两种存储方式。

1.顺序栈的实现

采用顺序存储的栈称为顺序栈,它利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(Top)指示当前栈顶元素的位置

栈顶指针:S.top,初始设置S.top=-1(初始值为-1,是因为地址从零开始,当第一个元素进栈时top+1=0,此时说明栈非空所以从top=-1开始);栈顶元素:S.data[S.top]

进栈操作:栈不满时,栈顶指针先加一再送值到栈顶元素。(注意顺序)

出栈操作:栈非空时,先取栈顶元素值,再将栈顶指针减一

栈空条件:S.top==-1;

栈满条件:S.top=MaxSize-1;(注意位序(元素个数)与存储下标的关系,存储下标从0开始)

栈长:S.top+1;

由于顺序栈的入栈操作受数组上界的约束,当对栈的最大使用空间估计不足时,有可能会发生栈上

注意:栈和队列的判空、判满条件,会因实际给的条件不同而变化,遇到具体问题要具体分析。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
是一种线性数据结构,它遵循先进后出(LIFO)的原则。的基本操作包括入(push)和出(pop),以及查看顶元素(top)和判断是否为空(empty)等。的应用非常广泛,比如在编译器中用于处理函数调用、表达式求值等。 的实现可以使用数组或链表,其中数组实现的叫做顺序,链表实现的叫做链式。顺序的入和出操作都是在数组的末尾进行,而链式的入和出操作则是在链表的头部进行。 的基本算法包括括号匹配、中缀表达式转后缀表达式、后缀表达式求值等。其中括号匹配是的典型应用,它可以用来判断一个表达式中的括号是否匹配。中缀表达式转后缀表达式和后缀表达式求值则是在编译器中常用的算法,它们可以用来实现。 下面是一个使用 Lua 实现的的代码示例: ```lua -- 的实现 local Stack = {} Stack.__index = Stack function Stack:new() local obj = {data = {}} setmetatable(obj, self) return obj end function Stack:push(value) table.insert(self.data, value) end function Stack:pop() return table.remove(self.data) end function Stack:top() return self.data[#self.data] end function Stack:empty() return #self.data == 0 end -- 使用来判断一个表达式中的括号是否匹配 function is_valid_expression(expr) local stack = Stack:new() for i = 1, #expr do local c = expr:sub(i, i) if c == '(' then stack:push(c) elseif c == ')' then if stack:empty() or stack:pop() ~= '(' then return false end end end return stack:empty() end ``` 中文加密是一种简单的加密算法,它可以将明文中的每个字符替换成另一个字符,从而达到加密的目的。下面是一个使用 Lua 实现的中文加密的代码示例: ```lua -- 中文加密的实现 local function encrypt(str) local result = {} for i = 1, #str do local c = str:sub(i, i) if c >= '一' and c <= '龥' then -- 将汉字替换成另一个汉字 table.insert(result, string.char(math.random(0x4e00, 0x9fa5))) else -- 其它字符不加密 table.insert(result, c) end end return table.concat(result) end -- 使用中文加密来加密一个字符串 local plaintext = "这是一段明文" local ciphertext = encrypt(plaintext) print(ciphertext) ``` 以上就是关于基本算法和中文加密的原理和实现的介绍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绞尽脑汁想个网名

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值