python出栈函数 python3 栈

python堆和栈的区别有哪些堆(Heap)与栈(Stack)是开发人员必须面对的两个概念 , 在理解这两个概念时,需要放到具体的场景下,因为不同场景下 , 堆与栈代表不同的含义 。一般情况下,有两层含义:
(1)程序内存布局场景下,堆与栈表示的是两种内存管理方式;
(2)数据结构场景下,堆与栈表示两种常用的数据结构 。
相关推荐:《Python教程》
堆与栈实际上是操作系统对进程占用的内存空间的两种管理方式,主要有如下几种区别:
(1)管理方式不同 。栈由操作系统自动分配释放 , 无需我们手动控制;堆的申请和释放工作由程序员控制 , 容易产生内存泄漏;
(2)空间大小不同 。每个进程拥有的栈的大小要远远小于堆的大小 。理论上 , 程序员可申请的堆大小为虚拟内存的大?。?进程栈的大小 64bits 的 Windows 默认 1MB,64bits 的 Linux 默认 10MB;
【python出栈函数 python3 栈】(3)生长方向不同 。堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低 。
(4)分配方式不同 。堆都是动态分配的,没有静态分配的堆 。栈有2种分配方式:静态分配和动态分配 。静态分配是由操作系统完成的,比如局部变量的分配 。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由操作系统进行释放,无需我们手工实现 。
(5)分配效率不同 。栈由操作系统自动分配,会在硬件层级对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高 。堆则是由C/C提供的库函数或运算符来完成申请与管理 , 实现机制较为复杂,频繁的内存申请容易产生内存碎片 。显然,堆的效率比栈要低得多 。
(6)存放内容不同 。栈存放的内容,函数返回地址、相关参数、局部变量和寄存器内容等 。当主函数调用另外一个函数的时候,要对当前函数执行断点进行保存,需要使用栈来实现,首先入栈的是主函数下一条语句的地址,即扩展指针寄存器的内容(EIP),然后是当前栈帧的底部地址 , 即扩展基址指针寄存器内容(EBP),再然后是被调函数的实参等,一般情况下是按照从右向左的顺序入栈,之后是被调函数的局部变量,注意静态变量是存放在数据段或者BSS段,是不入栈的 。出栈的顺序正好相反,最终栈顶指向主函数下一条语句的地址 , 主程序又从该地址开始执行 。堆,一般情况堆顶使用一个字节的空间来存放堆的大?。?而堆中具体存放内容是由程序员来填充的 。
从以上可以看到,堆和栈相比,由于大量malloc()/free()或new/delete的使用,容易造成大量的内存碎片 , 并且可能引发用户态和核心态的切换,效率较低 。栈相比于堆 , 在程序中应用较为广泛,最常见的是函数的调用过程由栈来实现,函数返回地址、EBP、实参和局部变量都采用栈的方式存放 。虽然栈有众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间 , 主要还是用堆 。
无论是堆还是栈,在内存使用时都要防止非法越界,越界导致的非法内存访问可能会摧毁程序的堆、栈数据 , 轻则导致程序运行处于不确定状态,获取不到预期结果 , 重则导致程序异常崩溃 , 这些都是我们编程时与内存打交道时应该注意的问题 。
python答疑:关于队列出栈和入栈的,报错是why?没有问题啊 你的代码缩进有问题吧:
class MyStack(object):
def __init__(self, max):
self.head = -1
self.stack = list()
self.max = max
for i in range(self.max):
self.stack.append(0)
def put(self, item):
if self.head = self.max:
return 'Put Error: The Stack is Overflow!'
else:
self.head= 1
self.stack[self.head] = item
print 'Put %s Success' % item
def get(self):
if self.head0:
return 'Get Error: The Stack is Empty!'
else:
self.head -= 1
return self.stack[self.head 1]
def isEmpty(self):
if self.head-1:
return True
return False
if __name__ == "__main__":
mystack = MyStack(100)
mystack.put('a')
mystack.put('b')
print mystack.get()
mystack.put('c')
print mystack.get()
print mystack.get()
print mystack.get()
用Python3实现表达式求值include malloc.h #include stdio.h #include ctype.h//判断是否为字符的函数的头文件 #define maxsize 100typedef int elemtype; typedef struct sqstack sqstack;//由于sqstack不是一个类型 而struct sqstack才是char ch[7]=;//把符号转换成一个字符数组 int f1[7]=;//栈内元素优先级 int f2[7]=;//栈外的元素优先级struct sqstack { elemtype stack[maxsize]; int top; };void Initstack(sqstack *s) { s-top=0; }void Push(sqstack *s,elemtype x) { if(s-top==maxsize-1) printf("Overflow\n"); else { s-top; s-stack[s-top]=x; } }void Pop(sqstack *s,elemtype *x) { if(s-top==0) printf("underflow\n"); else { *x=s-stack[s-top]; s-top--; } }elemtype Gettop(sqstack s) { if(s.top==0) { printf("underflow\n"); return 0; } elsereturn s.stack[s.top]; }elemtype f(char c) { switch(c) { case ' ': return 0; case '-': return 1; case '*': return 2; case '/': return 3; case '(': return 4; case ')': return 5; default: return 6; } }char precede(char c1,char c2) { int i1=f(c1); int i2=f(c2);//把字符变成数字 if(f1[i1]f2[i2])//通过原来设定找到优先级 return ''; else if(f1[i1]f2[i2]) return ''; elsereturn '='; }int Operate(elemtype a,elemtype theta,elemtype b) { int sum; switch(theta) { case 0: sum=a b; break; case 1: sum=a-b; break; case 2: sum=a*b; break; default: sum=a/b; } return sum; }EvaluateExpression() { char c; int i=0,sum=0; int k=1,j=1;//设置了开关变量 elemtype x,theta,a,b; sqstack OPTR,OPND; Initstack(OPTR); Push(OPTR,f('#'));//0压入栈 Initstack(OPND); c=getchar(); if(c==ch[2]||c==ch[3]||c==ch[5]||c==ch[6])//先对+和-的情况忽略和左括号的情况 { printf("错误1 \n"); k=0; return 0; }if(c==ch[0]) c=getchar();//如果是+ , 把它覆盖 if(c==ch[1]) {j=0; c=getchar();//也把-号覆盖 } while(c!='#'||ch[Gettop(OPTR)]!='#') { if(isdigit(c)) { sum=0; while(isdigit(c)) { if(!j) { sum=sum*10-(c-'0');//实现了数字串前面有负号(之前是:sum=-(sum*10)-(c-'0')结果是-12+13=21) } else sum=sum*10 (c-'0'); c=getchar(); } Push(OPND,sum);//如果还是数字先不压栈 , 把数字串转化成十进制数字再压栈 j=1; } else if(k) { switch(precede(ch[Gettop(OPTR)],c)) { case'': Push(OPTR,f(c));//把它们整型化 c=getchar(); if(c==ch[0]||c==ch[1]||c==ch[2]||c==ch[3]||c==ch[5]||c=='\n')//要除去下个是‘(’的情况 也把以运算符归到这里来 {printf("出错2\n"); k=0; return 0;//加了开关变量和返回0的值使程序更以操作 }break; case'=': Pop(OPTR,x); c=getchar(); if(c==ch[0]||c==ch[1]||c==ch[2]||c==ch[3]||c==ch[5]||c=='\n')//把ch[6]的情况也忽略了但此时并没有注意到右括号后面右运算符的情况 { printf("出错2\n"); k=0; return 0; }break; case'': Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a);//注意这里是谁先出栈 Push(OPND,Operate(a,theta,b)); break; } } }//在这里判断是否以运算符结束是不对的return(Gettop(OPND)); }main() { int result; printf("输入你的算术表达式:\n"); result=EvaluateExpression(); printf("结果是 :%d\n",result); return 0; }: 本计算器利用堆栈来实现 。1、定义后缀式计算器的堆栈结构 因为需要存储的单元不多,这里使用顺序栈,即用一维数组来模拟堆栈: #define MAX 100 int stack[MAX]; int top=0; 因此程序中定义了长度为MAX的一维数组,这里MAX用宏定义为常数100,我们可以修改宏定义而重新定义堆栈的大小 。整型数据top为栈顶指示,由于程序开始时堆栈中并无任何数据元素,因此top被初始化为0 。2、存储后缀式计算器的运算数 我们定义了堆栈stack[MAX]后,就可以利用入栈操作存储先后输入的两个运算数 。下面看一下是如何实现的: int push(int i) /*存储运算数 , 入栈操作*/ { if(topMAX) { stack[top]=i; /*堆栈仍有空间 , 栈顶指示上移一个位置*/ return 0; } else /*堆栈已满,给出错误信息,返回出错指示*/ { printf("The stack is full"); return ERR; } } 我们在调用函数push时,如果它的返回值为0,说明入栈操作成功;否则,若返回值为ERR(在程序中说明为-1),说明入栈操作失败 。3、从堆栈中取出运算数 当程序中读完了四则运算符后,我们就可以从堆栈中取出已经存入的两个运算数,构成表达式,计算出结果 。取出运算数的函数采用的正是出栈算法 。在本例中 , 实现该算法的函数 为pop(): int pop(); /*取出运算数,出栈操作*/ { int var; /*定义待返回的栈顶元素*/ if(top!=NULL) /*堆栈中仍有数据元素*/ { var=stack[top--]; /*堆栈指示下移一个位置*/ return var; } else /*堆栈为空,给出错误信息,并返回出错返回值*/ printf("The stack is cmpty!\n"); return ERR; } 同样 , 如果堆栈不为空,pop()函数返回堆栈顶端的数据元素,否则,给出栈空提示,并返回错误返回值ERR 。4、设计完整的后缀式计算器 有了堆栈存储运算数,后缀式计算器的设计就很简单了 。程序首先提示用户输入第一个运算数 , 调用push()函数存入堆栈中;而后提示用户输入第二个运算数,同样调用push()函数存入堆栈中 。接下来,程序提示用户输入 ,-,*,/四种运算符的一种 , 程序通过switch_case结构判断输入运算符的种类 , 转而执行不同的处理代码 。以除法为例,说明程序的执行流程: case '/': b=pop(); a=pop(); c=a/b; printf("\n\nThe result is %d\n",c); printf("\n"); break; 程序判断用户输入的是除号后,就执行上述代码 。首先接连两次调用pop()函数从堆栈中读出先前输入的运算数,存入整型数a和b中;然后执行除法运算 , 结果存入单元c中 。这时需要考虑究竟谁是被除数,谁是除数 。由于开始我们先将被除数入栈,根据堆栈“先进后出”的原则,被除数应该是第二次调用pop()函数得到的返回值 。而除数则是第一次调用pop()函数得到的返回值 。最后程序打印出运算结果 , 并示提示用户是否继续运行程序: printf("\t Continue?(y/n):"); l=getche(); if(l=='n') exit(0); 如果用户回答是"n",那么结束程序,否则继续循环 。完整的程序代码如下: #includestdio.h #includeconio.h #includestdlib.h #define ERR -1 #define MAX 100 /*定义堆栈的大小*/ int stack[MAX]; /*用一维数组定义堆栈*/ int top=0; /*定义堆栈指示*/int push(int i) /*存储运算数,入栈操作*/ { if(topMAX) { stack[top]=i; /*堆栈仍有空间,栈顶指示上移一个位置*/ return 0; } else { printf("The stack is full"); return ERR; } } int pop() /*取出运算数 , 出栈操作*/ { int var; /*定义待返回的栈顶元素*/ if(top!=NULL) /*堆栈中仍有元素*/ { var=stack[top--]; /*堆栈指示下移一个位置*/ return var; /*返回栈顶元素*/ } else printf("The stack is empty!\n"); return ERR; } void main() { int m,n; char l; int a,b,c; int k; do{ printf("\tAriothmatic Operate simulator\n"); /*给出提示信息*/ printf("\n\tPlease input first number:"); /*输入第一个运算数*/ scanf("%d",m); push(m); /*第一个运算数入栈*/ printf("\n\tPlease input second number:"); /*输入第二个运算数*/ scanf("%d",n); push(n); /*第二个运算数入栈*/ printf("\n\tChoose operator( /-/*//):"); l=getche(); /*输入运算符*/ switch(l) /*判断运算符,转而执行相应代码*/ { case ' ': b=pop(); a=pop(); c=a b; printf("\n\n\tThe result is %d\n",c); printf("\n"); break; case '-': b=pop(); a=pop(); c=a-b; printf("\n\n\tThe result is %d\n",c); printf("\n"); break; case '*': b=pop(); a=pop(); c=a*b; printf("\n\n\tThe result is %d\n",c); printf("\n"); break; case '/': b=pop(); a=pop(); c=a/b; printf("\n\n\tThe result is %d\n",c); printf("\n"); break; } printf("\tContinue?(y/n):"); /*提示用户是否结束程序*/ l=getche(); if(l=='n') exit(0); }while(1); }: #include stdio.h #include conio.h #include malloc.h #include stdlib.h#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status;#define STACK_INIT_SIZE 100 //初始分配量 #define STACKINCREMENT 10 //存储空间的分配增量typedef char ElemType;typedef ElemType OperandType; //操作数 typedef char OperatorType;typedef struct { ElemType *base; ElemType *top; int stacksize; }SqStack;Status InitStack(SqStack S) { //构造一个空栈S S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if(!S.base) exit (OVERFLOW); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; }Status GetTop(SqStack S){ ElemType e; if (S.top == S.base) return ERROR; e = *(S.top-1); return e; }Status Push (SqStack S,ElemType e) { //插入元素e为新的栈顶元素 if (S.top - S.base = S.stacksize){ S.base = (ElemType *) realloc ( S.base, (S.stacksizeSTACKINCREMENT) * sizeof(ElemType)); if(!S.base) exit (OVERFLOW); S.top = S.baseS.stacksize; S.stacksize= STACKINCREMENT; } *S.top= e; return OK; }Status Pop (SqStack S,ElemType e){ //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR if(S.top == S.base) return ERROR; e = * --S.top; return OK; }char In(char c,char OP[]) { if(c=35c=47) return 1; else return 0; }char OP[8]=; int m[7][7]={1,1,2,2,2,1,1,1,1,2,2,2,1,1,1,1,1,1,2,1,1, 1,1,1,1,2,1,1, 2,2,2,2,2,0,-1, 1,1,1,1,-1,1,1, 2,2,2,2,2,-1,0};//120 = -1 不存在char Precede(char i,char j) { int a,b; char *p; for(p=OP,a=0;*p!='\0';p,a) if(*p==i) break; for(p=OP,b=0;*p!='\0';p,b) if(*p==j) break; if(m[a][b]==1) return ''; else if(m[a][b]==2) return ''; else if(m[a][b]==0) return '='; else return 'O'; }char Operate(char a,char theta,char b) { if(a47) a=atoi(a); if(b47) b=atoi(b); switch(theta) {case ' ': return a b; break; case '-': return a-b; break; case '*': return a*b; break; case '/': return a/b; break; } }OperandType EvaluateExpression() { SqStack OPTR,OPND; OperandType a,b,c; OperatorType theta; InitStack(OPTR); Push(OPTR,'#'); InitStack(OPND); c=getchar(); while (c!='#' || GetTop(OPTR)!='#') { if (!In(c,OP)) else switch(Precede(GetTop(OPTR),c)) { case '' : Push(OPTR,c); c = getchar(); break; case '=' : Pop(OPTR,c); c = getchar(); break; case '' : Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND,Operate(a,theta,b)); break; } } return GetTop(OPND); }void main() { printf("(以#为结束符)\n"); printf("请输入:\n"); int a; a=(int)EvaluateExpression(); printf("%d",a); getch(); }: ls都正确: CIn Action这本书里面有表达式求值的详细项目分析.: 数据结构的书里面都有的,仔细看一下: studyall123的只能对0到9的数字运算才有效,对于10以上的数字就不行!不知道有没有更好的方法!: 现在的人,连google一下都懒啊: 实际上是按照逆波兰式的顺序让输入的表达式入栈,再根据运算符优先级来计算 。: lenrning!
python实现堆栈与队列的方法python实现堆栈与队列python出栈函数的方法
本文实例讲述python出栈函数了python实现堆栈与队列的方法 。分享给大家供大家参考 。具体分析如下:
1、python实现堆栈,可先将Stack类写入文件stack.py,在其它程序文件中使用from stack import Stack,然后就可以使用堆栈了 。
stack.py的程序:
代码如下:class Stack():
def __init__(self,size):
self.size=size;
self.stack=[];
self.top=-1;
def push(self,ele):#入栈之前检查栈是否已满
if self.isfull():
raise exception("out of range");
else:
self.stack.append(ele);
self.top=self.top 1;
def pop(self):# 出栈之前检查栈是否为空
if self.isempty():
raise exception("stack is empty");
else:
self.top=self.top-1;
return self.stack.pop();
def isfull(self):
return self.top 1==self.size;
def isempty(self):
return self.top==-1;
再写一个程序文件,stacktest.py,使用栈 , 内容如下:
代码如下:#!/usr/bin/python
from stack import Stack
s=Stack(20);
for i in range(3):
s.push(i);
s.pop()
print s.isempty();
2、python 实现队列:
复制代码代码如下:class Queue():
def __init__(self,size):
self.size=size;
self.front=-1;
self.rear=-1;
self.queue=[];
def enqueue(self,ele):#入队操作
if self.isfull():
raise exception("queue is full");
else:
self.queue.append(ele);
self.rear=self.rear 1;
def dequeue(self):#出队操作
if self.isempty():
raise exception("queue is empty");
else:
self.front=self.front 1;
return self.queue[self.front];
def isfull(self):
return self.rear-self.front 1==self.size;
def isempty(self):
return self.front==self.rear;
q=Queue(10);
for i in range(3):
q.enqueue(i);
print q.dequeue();
print q.isempty();
希望本文所述对大家的Python程序设计有所帮助 。
python 语法 出栈进栈 全局变量的问题python出栈函数我这里显示的3python出栈函数,不知到你那是不是哪里出了问题 。
这个是作用域的关系,sBuf你是在全局作用域中调用的,所以不需要使用global声明的 。
你定义的方法没有问题,不知道你说的正确是什么意思 。
[0 for _ in xrange(10)],再好的你说的使用标准库方法吧 ,
map(lambda x, y: 0, range(10), [])
如果解决了您的问题请采纳python出栈函数!
如果未解决请继续追问
Python语言如何实现包含min函数的栈仅供参考
# coding=utf8
'''
题目:定义栈的数据结构python出栈函数,请在该类型中实现一个能够得到栈的最小元素的min函数 。
在该栈中python出栈函数,调用min、push及pop的时间复杂度都是O(1) 。
'''
class Stack():
def __init__(self):
self.main_stack = []
# 辅助栈python出栈函数,每次次最小的元素压入辅助栈
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 dataself._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()
关于python出栈函数和python3 栈的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读