
正文
python函数栈的描述 python中栈
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
栈是什么结构?
问题一:栈和队列都是什么结构 队列是先进先出:就像一条路,有一个入口和一个出口,先进去的就可以先出去。
而栈就像一个箱子,后放的在上边,所以后进先出。
两者的结构通常采用的两种存储结构是顺序存储结构和链表存储结构。
问题二:什么是栈? 栈的定义:栈是一种特殊的表这种表只在表头进行插入和删除操作。因此,表头对于栈来说具有特殊的意义,称为栈顶。相应地,表尾称为栈底。不含任何元素的栈称为空栈。
栈的逻辑结构:假设一个栈S中的元素为an,an-1,..,a1,则称a1为栈底元素,an为栈顶元 素。栈中的元素按a1 ,a2,..,an-1,an的次序进栈。在任何时候,出栈的元素都是栈顶元素。换句话说,栈的修改是按后进先出的原则进行的.因此,栈又称为后进先出(Last In First Out)表,简称为LIFO表。所以,只要问题满足LIFO原则,就可以使用栈。
notice:换句话说,栈就是可以一个元素进后,可以接着进行输出的表.这道题各个选项的进出次序为:
A:进,出,进,出,进,出,进,进,出,出,进,出,进,出
B:进,进,出,进,出,出,进,进,进,出,出,进,出,出
C:进,出,进,进,进,进,出,出,出,出,进,出,进,出
D:进,进,进,进,出,出,进,进,出,出,出,出,进,出
E:错误.原因自己仿照上面做做看.
所以这道题选E.明白了吗?
问题三:栈的两种存储结构各有哪些优缺点 顺序 存储结构:
优点:连续存储,空间利用率高
缺点:不方便数据的增删
链式存储结构:
优点:对于数据的增删比较方便
缺点:浪费空间
问题四:栈是不是顺序存储的线性结构啊? 呃~弄明白两个概念:存储结构和逻辑结构。主要的存储结构是顺序存储和链式存储(基本这两个就OK了)。而逻辑结构是指线性表(栈、队列属于线性表的范畴)、图、二叉树等概念。理论上所有的逻辑结构都可以用上面两种存储结构在计算机内实现(当然从效率、存储空间等方面考虑实际实现中不同的逻辑结构采用的存储结构会有所偏重)~举个类似的例子:汽车和内燃机,内燃机主要有汽油机和柴油机两类,汽车有卡车、轿车、客车等,理论上所有的汽车都可以用两种内燃机做动力,我可以说客车是汽车,客车既可以是汽油机驱动的汽车也可以有柴油机驱动的汽车。所以栈是线性表,但栈既可以用可以顺序存储实现也可以用链式存储实现。
问题五:栈在数据结构中有什么作用呢 可以实现很多算法解决一些问题,比如哈夫曼树中的一种排序可用栈写,以及拓扑排序等之类的,还可以用栈解决迷宫寻路问题
问题六:栈和队列数据结构的特点,什么情况下用到栈,什么情况下用到队列(各举3个例子) 栈:特点就是一个先进后出的结构。
队列:特点就是一个先进先出的结构。
一般只要你满足这个特点就可以称之为栈或队列。
栈的应用:非常广泛,在CPU内部就有提供栈这个机制。主要用途:函数调用和返回,数字转字符,表达式求值,走迷宫等等。在CPU内部栈主要是用来进行子程序调用和返回,中断时数据保存和返回。在编程语言中:主要用来进行函数的调用和返回。可以说在计算机中,只要数据的保存满足先进后出的原理,都优先考虑使用栈,所以栈是计算机中不可缺的机制。
队列的应用:队列主要用在和时间有关的地方,特别是操作系统中,队列是实现多任务的重要机制。windows中的消息机制就是通过队列来实现的。进程调度也是使用队列来实现,所以队列也是一个重要的机郸。只要满足数据的先进先出原理就可以使用队列。
问题七:栈的顺序存储结构 这是结果,需要的话给我个邮箱
/*
在vc++6.0中的输出结果:
------------------------
初始化栈.....
创建一个包含5个不大于100的正整数值的栈(5个值由计算机随机产生)...
栈中的元素从栈底到栈顶为:41 67 34 0 69
请输入要插在栈顶的元素e = 100
栈中的元素从栈底到栈顶为:41 67 34 0 69 100
弹出的栈顶元素 e = 100
栈中的元素从栈底到栈顶为:41 67 34 0 69
栈中元素个数是5
输出从栈顶到栈底的所有元素:69 0 34 67 41
Press any key to continue
--订---------------------------
*/
问题八:C语言中的栈、堆是什么? 计算机中的内存分为两部分:一部分是栈(stack,也称堆栈),另一部分是堆(heap)。
栈,可以看作是一摞卡片,最上面的卡片表示程序的当前作用域,这往往就是当前正在执行的函数。当前函数中声明的所有变量都置于栈顶帧中,即占用栈顶帧的内存,这就相当于一摞卡片中最上面的一张卡片。如果当前函数调用了另一个函数,举例来说,当前函数foo()调用了另一个函数bar(),就会在这摞卡片上再加一个新的卡片,这样bar()就有了自己的栈帧(stack frame)以供使用。从foo()传递到bar()的所有参数都会从foo()栈帧复制到bar()栈帧中。(注:栈帧很有意义,因为栈帧可以为每个函数提供一个独立的内存工作区。如果一个变量是在foo()栈帧中声明的,那么调用bar()函数不会对它带来改变,除非你专门要求修改这个变量。另外,foo()函数运行结束时,栈帧即消失,该函数中声明的所有变量都不会再占用内存了。)
堆,一段完全独立于当前函数或者栈帧的内存区。如果一个函数中声明了一些变量,而且希望当这个函数完成时其中声明的变量仍然存在,就可以将这些变量置于堆中。 堆和栈相比,没那么清晰的结构性。可以把堆可作是一“堆”小玩艺。程序可以在任何时间向这个“堆”增加新的东西,或者修改堆中已有的东西。
相关问答
Q1: Python数据结构-单调栈(Monotone Stack)
一种特殊的栈,在栈的「先进后出」规则基础上,要求「从 栈顶 到 栈底 的元素是 单调递增(或者单调递减) 」。其中满足从栈顶到栈底的元素是单调递增的栈,叫做「单调递增栈」。满足从栈顶到栈底的元素是单调递减的栈,叫做「单调递减栈」。
单调栈可以在时间复杂度为O(n)的情况下,求解出某个元素左边或者右边第一个比它大或者小的元素。
请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
Q2: "栈"和"栈帧"这两个概念到底如何区分
1、栈:FILO先进后出的数据结构
栈底是第一个进栈的数据的位置(压箱 底)
栈顶是最后一个进栈的数据位置
2、根据SP指针指向的位置,栈可分为 满栈和空栈
满栈:当sp指针总是指向最后压入堆栈 的数据(ARM采用满栈)
空栈:当堆栈指针SP总是指向下一个将 要放入数据的空位置。
3、根据SP指针移动的方向,可分为升 栈和降栈
升栈:随数据的入栈,SP由低地址-- 高地址
降栈:随数据的入栈,SP由高地址-- 低地址(ARM采用降栈)
4、栈帧:存储在用户栈上的(当然内核栈同样适用)每一次函数调用涉及的相关信息的记录单元 ; 栈帧(stack frame)就是一个函数所使用的那部分栈,所有函数的栈帧串起来就组成了一个完整的栈。
栈帧的两个边界分别有FP(R11)和SP(R13)L来限定。
栈帧
栈的作用:
1)保存局部变量
分析代码:
[html] view plain copy
#include stdio.h
int main()
{
int a;
a++;
return a;
}/span
反汇编之后的代码;
[html] view plain copy
stack: file format elf32-littlearm
Disassembly of section .text:
00000000 main:
#include stdio.h
int main()
{
0: e52db004 push {fp} ; (str fp, [sp, #-4]!) @将栈帧底部指针FP压入栈中;创建属于main函数的栈帧。
4: e28db000 add fp, sp, #0 ; 0x0 @fp指针为函数栈帧的底部,
8: e24dd00c sub sp, sp, #12 ; 0xc @sp指针为栈帧的顶部,同时为栈的栈顶。
int a;
a++;
c: e51b3008 ldr r3, [fp, #-8] @由此三句可知变量a在栈帧中执行了加法操作,及栈帧具有保存局部变量的作用
10: e2833001 add r3, r3, #1 ; 0x1
14: e50b3008 str r3, [fp, #-8]
return a;
18: e51b3008 ldr r3, [fp, #-8]
}
/span
2)保存函数的参数
分析代码:
[html] view plain copy
span style="font-size:18px;"#include stdio.h
void func1(int a,int b,int c,int d,int e,int f)
{
int k;
k=e+f;
}
int main()
{
func1(1,2,3,4,5,6);
return 0;
}
反汇编之后的代码;
void func1(int a,int b,int c,int d,int e,int f) @多于4个参数
{
0: e52db004 push {fp} ; (str fp, [sp, #-4]!)@保存main函数的栈帧底部指针FP
4: e28db000 add fp, sp, #0 ; 0x0
8: e24dd01c sub sp, sp, #28 ; 0x1c @由栈帧顶部指针SP创建一片栈帧保存子函数的前四个参数
c: e50b0010 str r0, [fp, #-16] @ a
10: e50b1014 str r1, [fp, #-20] @ b
14: e50b2018 str r2, [fp, #-24] @ c
18: e50b301c str r3, [fp, #-28] @ d
int k;
k=e+f;
1c: e59b3004 ldr r3, [fp, #4] @在子函数的栈帧中实现第五个参数与第六个参数的运算
20: e59b2008 ldr r2, [fp, #8] @由ldr r2, [fp, #8]知参数保存在main函数的栈帧中,并运算
24: e0833002 add r3, r3, r2 @以子函数的栈帧底部指针(fp)做参考坐标实现对参数的查找
28: e50b3008 str r3, [fp, #-8]
}
2c: e28bd000 add sp, fp, #0 ; 0x0
30: e8bd0800 pop {fp}
34: e12fff1e bx lr
00000038 main:
int main()
{
38: e92d4800 push {fp, lr} @由于调用子函数,先保存main函数的栈帧底部指针FP和返回地址LR(当前PC指针的下一地址)
3c: e28db004 add fp, sp, #4 ; 0x4 @可知先压入FP,后压入lr.把此时子函数(被调用者)的栈帧底部指针FP指向保存在子函数栈帧的main函数(调用者)的栈帧底部指针FP
40: e24dd008 sub sp, sp, #8 ; 0x8 @创建栈
func1(1,2,3,4,5,6);
44: e3a03005 mov r3, #5 ; 0x5
48: e58d3000 str r3, [sp]
4c: e3a03006 mov r3, #6 ; 0x6
50: e58d3004 str r3, [sp, #4]
54: e3a00001 mov r0, #1 ; 0x1 @用通用寄存器保存前四个参数的值
58: e3a01002 mov r1, #2 ; 0x2
5c: e3a02003 mov r2, #3 ; 0x3
60: e3a03004 mov r3, #4 ; 0x4
64: ebfffffe bl 0 func1
return 0;
68: e3a03000 mov r3, #0 ; 0x0
}
6c: e1a00003 mov r0, r3
70: e24bd004 sub sp, fp, #4 ; 0x4
74: e8bd4800 pop {fp, lr}
78: e12fff1e bx lr/span
注:C中,若函数的参数小于等于4个,则用通用寄存器保存其参数值,多于4个的参数保存在栈中
3)保存寄存器的值
分析代码:
[html] view plain copy
span style="font-size:18px;"include stdio.h
void func2(int a,int b)
{
int k;
k=a+b;
}
void func1(int a,int b)
{
int c;
func2(3,4);
c=a+b;
}
int main()
{
func1(1,2);
return 0;
}/span
反汇编之后的代码;
[html] view plain copy
span style="font-size:18px;"void func2(int a,int b)
{
0: e52db004 push {fp} ; (str fp, [sp, #-4]!)
4: e28db000 add fp, sp, #0 ; 0x0
8: e24dd014 sub sp, sp, #20 ; 0x14
c: e50b0010 str r0, [fp, #-16] @保存寄存器的值
10: e50b1014 str r1, [fp, #-20]
int k;
k=a+b;
14: e51b3010 ldr r3, [fp, #-16]
18: e51b2014 ldr r2, [fp, #-20]
1c: e0833002 add r3, r3, r2
20: e50b3008 str r3, [fp, #-8]
}
24: e28bd000 add sp, fp, #0 ; 0x0
28: e8bd0800 pop {fp}
2c: e12fff1e bx lr
00000030 func1:
void func1(int a,int b)
{
30: e92d4800 push {fp, lr}
34: e28db004 add fp, sp, #4 ; 0x4
38: e24dd010 sub sp, sp, #16 ; 0x10
3c: e50b0010 str r0, [fp, #-16] @代码44行调用func2函数后,又使用r0\r1保存参数,所以此时将r0\r1寄存器的
40: e50b1014 str r1, [fp, #-20] @值放入栈中
int c;
func2(3,4);
44: e3a00003 mov r0, #3 ; 0x3
48: e3a01004 mov r1, #4 ; 0x4
4c: ebfffffe bl 0 func2
c=a+b;
50: e51b3010 ldr r3, [fp, #-16]
54: e51b2014 ldr r2, [fp, #-20]
58: e0833002 add r3, r3, r2
5c: e50b3008 str r3, [fp, #-8]
}
60: e24bd004 sub sp, fp, #4 ; 0x4
64: e8bd4800 pop {fp, lr}
68: e12fff1e bx lr
0000006c main:
int main()
{
6c: e92d4800 push {fp, lr}
70: e28db004 add fp, sp, #4 ; 0x4
func1(1,2);
74: e3a00001 mov r0, #1 ; 0x1
78: e3a01002 mov r1, #2 ; 0x2
7c: ebfffffe bl 30 func1
return 0;
80: e3a03000 mov r3, #0 ; 0x0
}
84: e1a00003 mov r0, r3
88: e24bd004 sub sp, fp, #4 ; 0x4
8c: e8bd4800 pop {fp, lr}
90: e12fff1e bx lr/span
初始化栈:即对SP指针赋予一个内存地址(统一标准:2440、6410、210)
在内存的64MB位置即ldr sp, =0x34000000(2440)
ldr sp, =0x54000000(6410)
ldr sp, =0x24000000(210)
由上可知ARM采用满栈(指向刚入栈的数据)、降栈(由高地址向低地址入栈)
问题:因为ARM不同工作模式有不同的栈,定义栈的技巧是什么,避免定义相同的地址使用不同栈?
转自:
Q3: Python数据结构-栈与深度优先搜索(Stack)
堆栈是算法和程序中最常用的辅助结构,其的应用十分广泛。堆栈基本应用于两个方面:
整数除法仅保留整数部分。
深度优先搜索算法(Depth First Search) :英文缩写为 DFS。是一种用于遍历或搜索树或图的算法。该算法沿着树的深度遍历树的节点,会尽可能深的搜索树的分支。当节点 v 的所在边都己被探寻过,搜索将 回溯 到发现节点 v 的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
在深度优先遍历的过程中,我们需要 将当前遍历节点 v 的相邻节点暂时存储起来 ,以便于在回退的时候可以继续访问它们。遍历到的节点顺序符合 「后进先出」 的特点,所以深度优先搜索可以通过 「递归」或者「堆栈」 来实现。
给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。
图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。
输入:(((()
输出:False
要求判别 {{{{[[[((()))]]]}}}}
中缀表达式 A + B; A + B * C; (A + B) * C
前缀表达式 + AB ; + A * BC ; * +ABC
后缀表达式 AB + ; A B C * +; AB + C*
在中缀表达式中必须有的括号,在前缀和后缀表达式中消失了
思路
1 将中缀表达式转换为全括号的形式
2 将所有的操作符移动到子表达式所在的左括号(前缀)或者右括号(后缀)处,再删除其它所有的括号
Q4: Python语言如何实现包含min函数的栈
仅供参考
# coding=utf8
'''
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。
在该栈中,调用min、push及pop的时间复杂度都是O(1)。
'''
class Stack():
def __init__(self):
self.main_stack = []
# 辅助栈,每次次最小的元素压入辅助栈
self.assist_stack = []
# 记录栈中的最小元素
self._min = None
def min(self):
return self._min
def push(self, data):
self.main_stack.append(data)
if self._min is None:
self._min = data
else:
if data self._min:
self._min = data
# 将最小的元素压入辅助栈
self.assist_stack.append(self._min)
def pop(self):
if len(self.main_stack) == 0:
raise Exception('no data')
elif len(self.main_stack) == 1:
self.assist_stack.pop()
self._min = None
return self.main_stack.pop()
else:
self.assist_stack.pop()
self._min = self.assist_stack[-1]
return self.main_stack.pop()
if __name__ == '__main__':
s = Stack()
s.push(3)
s.push(4)
s.push(2)
s.push(1)
print s.min()
s.pop()
s.pop()
print s.min()
s.pop()
print s.min()
s.pop()
print s.min()
s.pop()
Q5: python中的堆栈什么意思
堆栈是一种执行“后进先出”算法python函数栈的描述的数据结构。
设想有一个直径不大、一端开口一端封闭python函数栈的描述的竹筒。有若干个写有编号的小球,小球的直径比竹筒的直径略小。现在把不同编号的小球放到
竹筒里面,可以发现一种规律python函数栈的描述:先放进去的小球只能后拿出来,反之,后放进去的小球能够先拿出来。所以“先进后出”就是这种结构的
特点。
堆栈是计算机中最常用的一种数据结构,比如函数的调用在计算机中是用堆栈实现的。 堆栈可以用数组存储,也可以用以后会介绍的链
表存储。
堆栈就是这样一种数据结构。它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。
有一个地址指针总指向最后一个压入堆栈的数据所在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫
做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面
一个单元中,堆栈指示器中的地址自动加1。读取这些数据时,按照堆栈指示器中的地址读取数据,堆栈指示器中的地址数自动减 1。这
个过程叫做“弹出pop”。如此就实现了后进先出的原则。
推荐学习《python教程》。
关于python函数栈的描述和python中栈的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







