数据结构-->栈-数组实现
- 数据结构—>栈
- 栈同样也是有序表,但是插入,删除操作限定在表的同一端,向栈里添加元素的操作称为入栈
push
,从栈里面删除元素的操作称为出栈pop
; - 当元素入栈之后,最里面的元素称为栈底,最上面的元素称为栈顶元素,对于元素的插入和删除操作都是在栈顶完成的;
- 栈顶元素的指针称为
top
,栈具有的特性称为后入先出LIFO
; - 关于系统工作栈:
* 程序在运行时,系统工作栈wi函数传递参数提供存储空间.在每次进行函数调用时,程序都要在系统工作栈的栈顶创建一个结构实例,称为活动实例或者栈帧.
* 在进行函数调用时,活动记录仅仅记录指向上一条活动记录的指针以及该哈市南湖结束后的返回地址,对于上一个记录指针同样用于指向调用该函数的栈帧以及该函数
的返回地址,通常是该函数结束后,下一条语句的执行地址;
* 在某一时刻,只有一个函数体力面的元素在运行,所以这个函数的栈帧就位于系统工作栈的顶端;
* 如果这个函数调用调用其他函数,那么这个函数的局部变量,但是不包括声明为静态属性的变量,以及传递给调用函数的参数,就需要被压入帧栈,然后在系统工作栈的顶端创建新的调用函数栈帧;
* 当函数执行结束后,该函数的栈帧就会被删除,调用该函数的栈帧就会重新位于工作栈的顶端,继续执行新的语句;
* 由于递归函数是在调用自己的函数,所以上述调用机制对于递归函数来说也是适用的;
![这里写图片描述][SouthEast]
对于栈的实现,通常可以使用一维数组来实现:
typedef struct{
int key;
}element;
对于栈来说,需要满足的操作包括:
* `CreateStack(maxStackSize)`:用于创建一个大小为`max_size`的栈通常栈的创建使用数组来实现;
* `IsFull(stack,maxStackSize)`:表示用于判断栈是否为满的操作;
* `Isempty(stack)`:用于判断展示否为空的操作;
* `Push(stack,item)`:首先应该判断栈是否为满,然后应该将元素压入栈顶;
* `Pop()`:首先应该判断栈是否为空,然后将元素弹出;
- 栈通过数组来实现,是可以直接通过下标来访问元素的;
使用
C
语言静态数组模拟栈的操作过程,应为静态数组不能够作为函数参数进行返回,所以设置成为变量,同样的访问这里采用的是下标访问;include
include
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`的初始化操作;
- 推荐使用堆内存来扩展容量空间;
还没有评论,来说两句吧...