数据结构——指针堆栈
- 格式:docx
- 大小:14.30 KB
- 文档页数:3
【数据结构】堆栈的基本操作堆栈的概念:是⼀组相同类型数据的集合,并且拥有后进先出的特点,所有的操作都在堆栈顶端进⾏。
堆栈的基本操作:Init 创建⼀个空堆栈Push 把数据压⼊堆栈顶端Pop 从堆栈顶弹出数据Top 从栈顶取数据Empty 判断堆栈是否为空堆栈,是则返回true,否则返回falseFull 判断栈是否为满,是则返回true,否则返回false⽤数组实现堆栈:1 typedef struct st_stack{2int size;3int *data;4int top;5 }T_Stack;67int StackInit( T_Stack *ptStack, int *data, int size)8 {9 ptStack->size = size;10 ptStack->data = data;11 ptStack->top = 0;1213return0;14 }1516int StackPush( T_Stack *ptStack, int data )17 {18if( ptStack->top == ptStack->size )19 {20return -1;21 }2223 ptStack->data[ptStack->top++] = data;2425return0;26 }2728int StackPop( T_Stack *ptStack, int *data )29 {30if( ptStack->top == 0 )31 {32return -1;33 }3435 *data = ptStack->data[--ptStack->top];3637return0;38 }3940int StackTop( T_Stack *ptStack, int *data )41 {42if( ptStack->top == 0 )43 {44return -1;45 }4647 *data = ptStack->data[ptStack->top - 1];4849return0;50 }5152int StackIsEmpty( T_Stack *ptStack )53 {54return ( ptStack->top == 0 );55 }5657int StackIsFull( T_Stack *ptStack )58 {59return ( ptStack->top == ptStack->size );60 }。
嵌入式系统系统是嵌入到对象体中以嵌入式计算机为核心的专用计算机系统特点:针对具体应用设计,用于特定环境与通用计算机系统的区别:1>专用计算机系统2>运行环境差异很大3>比通用PC系统资源少4>功耗低、体积小、集成度高、成本低5>具有完整的系统测试和可靠性评估体系6>具有较长的生命周期7>需要专用开发工具和方法进行设计8>包含专用调试电路9>多学科知识集成系统看门狗定时器:在软件失去控制后使之重新开始正常运行1.当前程序状态寄存器CPSR(Current Program Status Register)和备份的程序状态寄存器SPSR (Saved Program Status Register),SPSR用于在程序异常中断时保存被中断的程序状态;增加了MRS指令和MSR指令用于完成对CPSR和SPSR寄存器的读写。
2.Thumb指令集是把32位的ARM指令集的一个子集重新编码后而形成的一个特殊的16位的指令集ARM处理器核可以工作在以下2种状态:ARM状态32位,ARM状态下执行字对准的32位ARM指令;Thumb状态16位,Thumb状态下执行半字对准的16位Thumb指令。
ARM处理器在两种工作状态之间切换方法进入Thumb状态当操作数寄存器Rm的状态位bit[0]为1时,执行BX Rm 指令进入Thumb状态。
进入ARM状态当操作数寄存器Rm的状态位bit[0]为0时,执行BX Rm指令进入ARM状态。
3.Arm处理器工作模式除用户模式外的其他6种模式称为特权模式,特权模式中除系统模式以外的5种模式又称为异常模式,即FIQ(Fast Interrupt Request)IRQ(Interrupt ReQuest)SVC(Supervisor)中止(Abort)未定义(Undefined)4.ARM处理器总共有37个寄存器,可以分为以下两类寄存器:31个通用寄存器R0~R15;R13_svc、R14_svc;R13_abt、R14_abt;R13_und、R14_und;R13_irq、R14_irq;R8_frq-R14_frq。
专用寄存器在MCS—51系列单片机中,共有z6个专用寄存器SFR(Special Functional Register),它们离散地分布在片内RAM的高128字节地址80H—FFH中,访问这些专用寄存器仅允许使用直接寻址方式。
专用寄存器并未占满高128字节RAM地址空间,但对没有被SFR 使用的串闲地址的操作是无意义的。
在MCS-51中,程序计数器PC不占据RAM单元,它在物理上是独立的,因此是唯一一个不可寻址的专用寄存器。
在除PC外的专用寄存器SFR中,有12个专用寄存器既可字节寻址,又可位寻址,如图2”7所示,其余的SFR则只能字节寻址。
表2-3列出了26个专用寄存器的名称及地址分配。
下面将对其中一些专用寄存储器的功能进行介绍,另外—些将留待后面有关章节介绍。
1.累加器ACC在累加器操作指令中,累加器的助记符简记为A。
MC5—5l中的8位算术逻辑部件AI。
H的结构,从总体上说仍是以累加器A为核心的结构。
累加器A在大部分的算术运算中存放某个操作数和运算结果;在很多的逻辑运算、数据传送等操作作为源或目的操作数,Atmel这和典型的以累加器A为中心的微处理器(如z 80cPu)相同。
但是,它在内部硬件结构上作厂改进,一部分指令在执行时不经过累加器A,以直接或间接寻址力式使数据在内部的任意地址单元和寄存器之间直接传输。
逻辑操作等也可以不经过A而直接进行,进一步提高了操作速度。
2.寄存器B寄存器B主要用于与累加器A配合执行乘法和除法指令的操作为育存寄存器。
3.程序状态字PSW程序状态字Fsw是一个8位寄存器,用来存放程序状态信息。
某些指令的执行结果:i 自动影响PSW的有关状态标志位,有些状态位可用指令来设置。
PSW寄存器各位的定义如CY(PSW .7) 进位标志,可由硬件或软件置位或复位。
在进行加法(或减法)运算时, 如果操作结果最高位(位7)向上有进位(或倍位),CY 置1,否则清0。
此外在进行位操作时, CY 又作为位累加器使用。
#include
#include
typedef struct Snode{
int data;
Snode *next;
}*Linksqstack,Qnode;
typedef struct {
Qnode *base;
Qnode *top;
}sqstack;
int Initstack(sqstack &S)//初始化栈
{
S.top=S.base=(Linksqstack)malloc(sizeof(Qnode));
if(!S.top)exit(0);
S.base->next=NULL;
return 0;
}
int Push(sqstack &S,int e)//插入元素
{
Linksqstack p;
p=(Linksqstack)malloc(sizeof(Qnode));
if(!p)exit(0);
p->data=e;
p->next=S.top;
S.top=p;
return 0;
}
int Creatstack(sqstack &S) //创立栈
{
int e;
printf("请输入元素,以'0'结束:");
while(1)
{
scanf("%d",&e);
if(e==0)break;
Push(S,e);
}
return 0;
}
int visit(int e) //输出栈元素
{
printf("%-3d",e);
return 0;
}
int stacktraverse(sqstack &S) //遍历栈
{
Linksqstack p;
p=S.top;
if(p==S.base)exit(0);
while(p!=S.base)
{
visit(p->data);
p=p->next;
}
return 0;
}
int Pop(sqstack &S,int &e)//删除栈顶元素
{
Linksqstack p;
if(S.base==S.top)exit(0);
p=S.top;
e=p->data;
S.top=S.top->next;
free(p);
return 0;
}
int Gettop(sqstack &S,int &e)//取栈顶元素,e返回
{
if(S.base==S.top)exit(0);
e=S.top->data;
return 0;
}
int Clearstack(sqstack &S)
{
int e;
while(1)
{
Pop(S,e);
}
}
int main()
{
int a,e;
sqstack S;
Initstack(S);
Creatstack(S);
stacktraverse(S);
putchar('\n');
while(1)
{
printf("请选择功能键:1代表入栈,2代表出栈,3代表取栈顶元素,4代表遍历栈,5代表
置空栈:");
scanf("%d",&a);
switch(a)
{
case 1:printf("请输入你要入栈的元素:");
scanf("%d",&e);
Push(S,e);
printf("插入后栈顶到栈底元素依次为:");
stacktraverse(S);
putchar('\n');break;
case 2:Pop(S,e);
printf("出栈元素为:%d",e);
putchar('\n');
printf("出栈后栈顶到栈底元素依次为:");
stacktraverse(S);break;
case 3:Gettop(S,e);
printf("栈顶元素为:%d",e);
putchar('\n');break;
case 4:printf("栈顶到栈底元素依次为:");
stacktraverse(S);
putchar('\n');break;
case 5:printf("栈已经为空\n");
Clearstack(S);break;
}
}
}