上海工程建设执业资格注册中心网站,seo专业知识培训,wordpress修改为中文,泰安人才网招聘网官网需求#xff1a;无 栈的概念#xff1a; 栈#xff1a;一种特殊的线性表#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶#xff0c;另一端为栈底。栈中的数据元素遵守后进先出#xff08;LIFO#xff09;原则。压栈无 栈的概念 栈一种特殊的线性表其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶另一端为栈底。栈中的数据元素遵守后进先出LIFO原则。压栈栈的插入操作叫做进栈/压栈/入栈入数据在栈顶。出栈栈的删除操作叫做出栈。出数据也在栈顶。 栈的图示 栈的实现一般可以使用数组和链表实现相对而言数组结构实现更优一些。因为尾插时代价小很多。不用遍历 栈的判空 栈的判空有二种实现方式一种是top赋为0一种是top赋为-1。区别是top为0的时候是先赋值再top为-1的时候相反。 栈的应用场景
函数的调用操作系统会给每一个线程分配一个独立的内存空间每一个内存空间其实就是一个栈结构它会将临时标量参数等等放到栈中当栈执行完的时候就会将最近的一个栈帧出栈。括号匹配判断括号是否匹配例如[][{}]
下面是源码
void StackInit(Stack* ps)
{assert(ps);ps-a NULL;ps-capacity ps-top 0;
}void StackPush(Stack* ps, STDateType x)
{assert(ps);if (ps-top ps-capacity){int newcapacity ps-capacity 0 ? 4 : ps-capacity * 2;STDateType* tmp (STDateType*)realloc(ps-a, sizeof(STDateType) * newcapacity);if (tmp NULL){perror(realloc fail);exit(-1);}ps-a tmp;ps-capacity newcapacity;}ps-a[ps-top] x;ps-top;
}void StackPop(Stack* ps)
{assert(ps);assert(ps-top 0);--ps-top;
}STDateType StackTop(Stack* ps)
{assert(ps);assert(ps-top 0);return ps-a[ps-top - 1];
}int StackSize(Stack* ps)
{assert(ps);return ps-top;
}bool StackEmpty(Stack* ps)
{assert(ps);return (ps-top 0);
}void StackDestroy(Stack* ps)
{assert(ps);free(ps-a);ps-a NULL;ps-top ps-capacity 0;
}