数据结构-->栈-数组实现
2017-10-19 20:24
190 查看
数据结构—>栈
栈同样也是有序表,但是插入,删除操作限定在表的同一端,向栈里添加元素的操作称为入栈
当元素入栈之后,最里面的元素称为栈底,最上面的元素称为栈顶元素,对于元素的插入和删除操作都是在栈顶完成的;
栈顶元素的指针称为
关于系统工作栈:
程序在运行时,系统工作栈wi函数传递参数提供存储空间.在每次进行函数调用时,程序都要在系统工作栈的栈顶创建一个结构实例,称为活动实例或者栈帧.
在进行函数调用时,活动记录仅仅记录指向上一条活动记录的指针以及该哈市南湖结束后的返回地址,对于上一个记录指针同样用于指向调用该函数的栈帧以及该函数
的返回地址,通常是该函数结束后,下一条语句的执行地址;
在某一时刻,只有一个函数体力面的元素在运行,所以这个函数的栈帧就位于系统工作栈的顶端;
如果这个函数调用调用其他函数,那么这个函数的局部变量,但是不包括声明为静态属性的变量,以及传递给调用函数的参数,就需要被压入帧栈,然后在系统工作栈的顶端创建新的调用函数栈帧;
当函数执行结束后,该函数的栈帧就会被删除,调用该函数的栈帧就会重新位于工作栈的顶端,继续执行新的语句;
由于递归函数是在调用自己的函数,所以上述调用机制对于递归函数来说也是适用的;
对于栈的实现,通常可以使用一维数组来实现:
对于栈来说,需要满足的操作包括:
栈通过数组来实现,是可以直接通过下标来访问元素的;
使用
对于使用静态数组来模拟栈的运行有一下几点不足:
在函数里面申请的空间在函数返回时,会进行释放;
使用数组的方式没有实现
推荐使用堆内存来扩展容量空间;
栈同样也是有序表,但是插入,删除操作限定在表的同一端,向栈里添加元素的操作称为入栈
push,从栈里面删除元素的操作称为出栈
pop;
当元素入栈之后,最里面的元素称为栈底,最上面的元素称为栈顶元素,对于元素的插入和删除操作都是在栈顶完成的;
栈顶元素的指针称为
top,栈具有的特性称为后入先出
LIFO;
关于系统工作栈:
程序在运行时,系统工作栈wi函数传递参数提供存储空间.在每次进行函数调用时,程序都要在系统工作栈的栈顶创建一个结构实例,称为活动实例或者栈帧.
在进行函数调用时,活动记录仅仅记录指向上一条活动记录的指针以及该哈市南湖结束后的返回地址,对于上一个记录指针同样用于指向调用该函数的栈帧以及该函数
的返回地址,通常是该函数结束后,下一条语句的执行地址;
在某一时刻,只有一个函数体力面的元素在运行,所以这个函数的栈帧就位于系统工作栈的顶端;
如果这个函数调用调用其他函数,那么这个函数的局部变量,但是不包括声明为静态属性的变量,以及传递给调用函数的参数,就需要被压入帧栈,然后在系统工作栈的顶端创建新的调用函数栈帧;
当函数执行结束后,该函数的栈帧就会被删除,调用该函数的栈帧就会重新位于工作栈的顶端,继续执行新的语句;
由于递归函数是在调用自己的函数,所以上述调用机制对于递归函数来说也是适用的;
对于栈的实现,通常可以使用一维数组来实现:
typedef struct{ int key; }element;
对于栈来说,需要满足的操作包括:
CreateStack(maxStackSize):用于创建一个大小为
max_size的栈通常栈的创建使用数组来实现;
IsFull(stack,maxStackSize):表示用于判断栈是否为满的操作;
Isempty(stack):用于判断展示否为空的操作;
Push(stack,item):首先应该判断栈是否为满,然后应该将元素压入栈顶;
Pop():首先应该判断栈是否为空,然后将元素弹出;
栈通过数组来实现,是可以直接通过下标来访问元素的;
使用
C语言静态数组模拟栈的操作过程,应为静态数组不能够作为函数参数进行返回,所以设置成为变量,同样的访问这里采用的是下标访问;
#include<stdio.h> #include<stdlib.h> #define MAX_SIZE 100 typedef struct { int key; } elements; elements Stack[MAX_SIZE]; int top=-1; int Isempty(elements *Stack) { return (top < 0 ? 0 : 1); } int Isfull(elements *Stack) { return (top == MAX_SIZE ? 0 : 1); } void Push(elements *Stack, int data) { if (!Isfull(Stack)) { fprintf(stderr, "Stack Isfull\n"); exit(EXIT_FAILURE); } else { top++; Stack[top].key = data; } } elements Pop(elements *Stack) { if (!Isempty(Stack)) { fprintf(stderr, "The Stack is empty\n"); exit(EXIT_FAILURE); } else return Stack[top--]; } int main() { Push(Stack,10); Push(Stack,9); Push(Stack,8); Push(Stack,7); Push(Stack,6); Push(Stack,5); Push(Stack,4); Push(Stack,3); Push(Stack,2); Push(Stack,1); Pop(Stack); Pop(Stack); printf("myStack contains:\n"); int i=0; for(i=top;i>=0;i--){ printf("[ %d ]\n",Stack[i].key); } return 0; }
对于使用静态数组来模拟栈的运行有一下几点不足:
在函数里面申请的空间在函数返回时,会进行释放;
使用数组的方式没有实现
Stack的初始化操作;
推荐使用堆内存来扩展容量空间;
相关文章推荐
- 数据结构和算法--栈的数组实现
- Java 数据结构之数组的操作三:实现各种排序方法
- 数据结构-堆栈-数组实现
- C++数据结构--用向量数组实现大(小)根堆的插入和删除
- 数据结构-用数组实现队列
- 数据结构(java语言描述)-- 表的简单数组实现
- 用js来实现那些数据结构(数组篇01)
- 数据结构Java实现——④数组——>稀疏矩阵三元组顺序存储
- [置顶] 【数据结构】 一个数组实现两个栈【面试】
- 程序员面试金典——解题总结: 9.14Java 14.6实现CircularAray类,支持类似数组的数据结构,这些数据结构可以高效地进行旋转
- 使用JavaScript的数组实现数据结构中的队列与堆栈
- 简单数据结构之数组栈(C++实现)
- 数组函数与数据结构《实现堆栈,实现队列》
- 常用数据结构-数组实现静态链表
- 重学数据结构004――栈的基本操作及实现(数组实现)
- 【数据结构】栈的数组实现
- java 数据结构实现数组封装 (一)
- 【数据结构】一个数组实现两个栈
- 数据结构与算法——在一个数组中实现两个堆栈(C语言)
- 数据结构---队列(数组实现)