入栈的顺序规律是排在前面的先进,排在后面的后进。
栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除 *** 作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。
向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
要搞清楚这个概念,首先要明白”栈“原来的意思,如此才能把握本质。栈,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈、出栈的说法。
首先系统或者数据结构栈中数据内容的读取与插入(压入push和 d出pop)是两回事!压入是增加数据,d出是删除数据 ,这些 *** 作只能从栈顶即最低地址作为约束的接口界面入手 *** 作 ,但读取栈中的数据是随便的没有接口约束之说。
很多人都误解这个理念从而对栈产生困惑。而系统栈在计算机体系结构中又起到一个跨部件交互的媒介区域的作用 即 cpu 与内存的交流通道 ,cpu只从系统给我们自己编写的应用程序所规定的栈入口线性地读取执行指令, 用一个形象的词来形容它就是pipeline(管道线、流水线)。cpu内部交互具体参见 EU与BIU的概念介绍。
1.堆栈用于响应中断或调用子程序时保护断点地址,也可通过栈 *** 作指令(push和pop保护和恢复现场)其中e5a48de588b63231313335323631343130323136353331333337396239入栈时先SP+1再将内容压入当前SP所指示的堆栈单元
中,出栈则先将SP所指示的内部ram单元中内容送入直接地址寻址的单元中,再将
SP减1.
2.中断允许寄存器的功能是控制CPU对中断的开放和屏蔽以及每个中断源是否允许
中断结构包括EA(CPU中断总允许位),ES(串行口中断允许位)ET1(定时器1中
断允许位)EX1(外部中断1中断允许位)ET0(定时器0中断允许位)EX0(外部中
断0中断允许位)
3.T机=12/fosc=12/(6*E6)=2us
X=2*E13-T/T机=8192-200/2=8092=1F9CH=1111 1100 1110 0B
因为TL1的高3位未用, 修正后X=1111 1100 0001 1100B=FC1CH
4.LJMP为长转移指令,可转向64KB程序存储器的任一单元;SJMP为相对转移指令
,偏移范围-128~+127共259字节;AJMP为绝对转移指令,转移目的在指令后一个
您好:
你是在学习数据结构方面的知识吧。
首先呢,你学习栈,要了解栈的定义,明白它是怎么一回事,就是去理解他的思想。
最后才去用代码来体现出来。
栈是先进后出,其实是用代码控制的,
其实你要他先进先出也可以。
你只要明白他的原理就行。
代码,你可以理解为跟计算的一种对话的语言。
不用想的那么复杂。
就好比说话,你只要知道你要说什么就行(算法),而不用刻意明白要怎么说(语法)。
下面给我出我以前写的代码,关于栈的,顺序栈,其实还有链栈。
/* 数据结构-栈 *//* 异常的细节处理还没弄好*/
#include <iostream>
#include <stdlib.h>
#include <malloc.h>
#define len_chu_shi 50 //初始空间大小
#define len_zeng_jia 10 //额外增加空间大小
#define OK 0 //正确
#define OVER -2 //
#define ERROR -1 //
using namespace std
typedef int elem_type //元素类型
typedef int function_type //函数类型
typedef struct zhan
{
elem_type *top //栈顶
elem_type *base //栈底
int len //当前空间大小
}zhan //栈结构
function_type Init_zhan(zhan *exam)//初始化栈
function_type Get_top(zhan *exam,elem_type *e)//获取栈顶元素
function_type Add_top(zhan *exam,elem_type *e)//增加栈顶元素
function_type Delete_top(zhan *exam, elem_type *e)//删除栈顶元素
int main(int argc,char *argv[])
{
zhan *example = (zhan *)malloc(sizeof(zhan))
Init_zhan(example)
return OK
}
function_type Init_zhan(zhan *exam)
{
exam->base = (elem_type *)malloc(len_chu_shi*sizeof(elem_type))
if(!exam->base) //分配失败
exit(OVER)
exam->top = exam->base
exam->len = len_chu_shi
return OK
}//--end
function_type Get_top(zhan *exam,elem_type *e)
{
if(!exam->base)
exit(OVER)
*e = *(exam->top - 1) //不能用自减运算符,那样会改变栈顶指针的值
return OK
}//--end
function_type Add_top(zhan *exam,elem_type *e)
{
if(exam->len <= exam->top - exam->base) //我个人觉得,如果 已经"<",就已经数据溢出了,就应该报错
exam->base = (elem_type *)realloc(exam->base,(exam->len + len_zeng_jia)*sizeof(elem_type))
if(!exam->base) //分配失败
exit(OVER)
*(exam->top++) = *e //应该是先改变栈顶指针的内容,然后栈顶指针再自增
exam->len += len_zeng_jia
return OK
}//--end
function_type Delete_top(zhan *exam, elem_type *e)
{
if(!exam->base) //空栈
exit(OVER)
*e = *(--exam->top) //应该是栈顶指针先自减,然后获取栈顶指针的内容
return OK
}//--end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)