数据结构之堆栈
有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步。另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体)
核心算法思想
堆栈,一种先进后出的线性表。仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
核心算法实现
顺序栈结构描述如下:
typedef struct Stack
{
Elemtype *top;
Elemtype *base;
int stacksize;
}SqStack;
初始化栈:
void IntiStack(sqstack *s)
{
s->base = (Elemtype*)malloc(stack_init_size*sizeof(Elemtype));
if (!s->base)
exit(0);
s->top = s->base; //设置栈为空
s->stacksize = stack_init_size;
}
入栈:
int Push(sqstack* s, Elemtype e)
{
if (s->top - s->base >= s->stacksize) //判断是否栈满
{
s->base = (Elemtype*)realloc(s->base, (s->stacksize + stack_increment)*sizeof(Elemtype));
if (!s->base)
exit(0);
s->top = s->base + s->stacksize; //重新设置栈顶
s->stacksize += stack_increment; //重新设置栈的大小
}
*(s->top) = e;
s->top++;
return 1;
}
出栈:
void Pop(sqstack* s, Elemtype *e)
{
if (s->top == s->base) //如果栈为空
return;
*e = *--(s->top);
}
实践出真知,代码案例
编写一个程序,利用栈的先进后出的特点,实现对于输入的任意一个非负十进制整数,打印输出与其等值的二进制数。
案例源码
constexpr auto STACK_INIT_SIZE = 20;
constexpr auto STACKINCREACE = 20;
typedef char Elemtype;
typedef int Status;
typedef struct {
Elemtype *top;
Elemtype *base;
int stacksize;
}SqStack;
Status InitStack(SqStack &S);
Status Push(SqStack &S, Elemtype e);
Status Pop(SqStack &s, Elemtype e);
Status StackEmpty(SqStack S);
Status InitStack(SqStack &S) {
S.base = (Elemtype*)malloc(STACK_INIT_SIZE * sizeof(Elemtype));
if (!S.base) { return false; }
S.stacksize = STACK_INIT_SIZE;
S.top = S.base;
return true;
}
Status Push(SqStack &S, Elemtype e) {
if (S.top - S.base >= S.stacksize) {
S.base = (Elemtype*)realloc(S.base, (S.stacksize + STACK_INIT_SIZE) * sizeof(Elemtype));
if (!S.base) { return false; }
S.top = S.base + S.stacksize;
S.stacksize += STACK_INIT_SIZE;
}
*S.top = e;
S.top++;
return true;
}
Status Pop(SqStack &S, Elemtype *e) {
if (S.base == S.top) { return false; }
else{
*e = *--S.top;
return true;
}
}
Status StackEmpty(SqStack S){
if (S.base == S.top) { return true; }
return false;
}
int main()
{
int N;
Elemtype e;
SqStack stack;
InitStack(stack);
scanf_s("%d",&N);
while (N)
{
Push(stack, N % 2);
N = N / 2;
}
while (!StackEmpty(stack))
{
Pop(stack,&e);
printf("%d",e);
}
}
面试常见问题
栈和队列有什么相同和区别?
栈和队列都是一种特殊的线性表,只允许在端点处插入和删除元素,区别在于栈是先进后出,后进先出,队列是先进先出,后进后出。
(tips:下一博讲队列)