什么是栈
栈的概念及结构:
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈,出数据也在栈顶。
特性:Last In First Out
先入后出
图例:
因为栈特殊的结构,栈是一个上开下闭的结构,我们将栈的底部定义为栈底并赋值为0或者-1当数据进栈将其存在栈底依次累计,直到栈满当数据需要出栈,从栈顶开始一个个往外出数据直到栈空。
栈的实现
栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些,因为数组在尾上插入数据的代价比较小。(这里代价就是指创建开空间)
代码精讲
创建栈
typedef int STDataType;
typedef struct Stack
{
STDataType* _a;
int _top; // 栈顶
int _capacity; // 容量
}Stack;
栈包括数组容量和栈顶位置三个结构。
初始化栈
void checkcapacity(Stack* ps)
{
if (ps->size>=ps->_capacity)
ps->capacity == 0 ? 4 : 2 * ps->capacity;
ps->_a = (STDataType)realloc(ps->_a,sizeof(STDataType)*capacity)
}
void StackInit(Stack* ps);
{
memset(&ps, 0, sizeof(ps->a));
ps->top = 0;
ps->capacity = 0;
}
无论什么结构我们都应当先初始化这里也可以检查容量是否超出限制。
入栈
// 入栈
void StackPush(Stack* ps, STDataType data);
{
ps->[top++] = data;
}
// 出栈
void StackPop(Stack* ps);
{
ps->top--;
}
将栈顶top减一就将最后加入的数据进行出栈。如果要回去最后加上返回值就行。
将数据给top的位置然后top再++存储下一个数据。
栈的运用
1.数制转换
由于计算过程是从低位到高位顺序产生,因为要计算得到八进制的各位顺序进栈,则按出栈序列打印输出即为与输入对应的八进制数。
2.括号匹配检验
这里就是个非常经典的题目。
括号匹配