十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线形表。
为长岛等地区用户提供了全套网页设计制作服务,及长岛网站建设行业解决方案。主营业务为成都做网站、成都网站设计、长岛网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
栈是一种数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
栈是只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进来的压在底下,随后一件一件往堆。取走时,只能从上面一件一件取。堆和取都在顶部进行,底部一般是不动的。
栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一堆称栈底。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO表)。
1、进栈(PUSH)算法
①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
②置TOP=TOP+1(栈指针加1,指向进栈地址);
③S(TOP)=X,结束(X为新进栈的元素);
2、退栈(POP)算法
①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
②X=S(SOP),(退栈后的元素赋给X);
③TOP=TOP-1,结束(栈指针减1,指向栈顶)。
/*
你看看这个例子吧
*/
# include "stdio.h"
# include "stdlib.h"
# define STACK_INIT_SIZE 10/*存储空间初始分配量,为了突出stackincrement有用
此处改小点为10(没有分号)*/
# define stackincrement 10/*存储空间分配增量,因为是顺序存储结构
一次分配固定的内存,本题是100个,而不是
动态分配存储空间,所以需要定义一个增量*/
typedef int SElemType;
typedef struct
{
SElemType *base;//栈底指针,栈构造之前和销毁之后,其值为NULL
SElemType *top;//栈顶指针
int stacksize;//当前已经分配的存储空间,以元素为单位
}SqStack;
void print(SElemType c)
{
printf("%d ",c);
}
//构造一个空栈S
void InitStack(SqStack * S)
{
if (! ((* S).base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))))//一次分配10个int类型的空间
{
exit(-1);
}
(* S).top = (* S).base;
(* S).stacksize = STACK_INIT_SIZE;
}
//将元素e插入栈顶
void Push(SqStack * S,SElemType e)
{
if ((* S).top-(* S).base = (* S).stacksize)//栈满,利用realloc增加存储空间每次增加stackincrement个int类型空间
{
(* S).base = (SElemType *)realloc((* S).base,((* S).stacksize+stackincrement)*sizeof(SElemType));
if (!(* S).base)
{
exit (-1);
}
(* S).top = (* S).base + (* S).stacksize;
(* S).stacksize = (* S).stacksize + stackincrement;
}
*((* S).top)++ = e;
}
//从栈底到栈顶依次对栈中每个元素调用函数visit
void StackTraverse(SqStack S,void (* visit)(SElemType))
{
while (S.top S.base)
{
visit(*(S.base)++);
}
printf("\n");
}
int main(void)
{
int j;
SqStack s;
SElemType e;
InitStack(s);
printf("初始化后栈s的空间为%d\n",s.stacksize);
for (j=1; j=12; ++j)
{
Push(s,j);
}
printf("操作完后,栈s的空间为%d\n",s.stacksize);/*第一次只分配了10个空间
但需要压入12个元素
所以需要增加stacksize个*/
printf("栈中的元素为:");
StackTraverse(s,print);
return 0;
}
/*
在vc++6.0中的输出结果:
------------------------
初始化后栈s的空间为10
操作完后,栈s的空间为20
栈中的元素为:1 2 3 4 5 6 7 8 9 10 11 12
------------------------------
*/
BiTree是一个自定义类型
Stack是这个类型的一个数组
中括号里面应该是一个宏
后面的p是另外一个变量
类型一样是BiTree
简单的说,这个定义就是一个数组,看不出来是不是栈