- 栈的概念
只能在表尾进行插入(入栈)和删除(出栈)的数据结构,也就是表头和中间不能插入和删除(受到限制的线性表); 其表尾比较特殊,我们一般把这个表尾叫做栈顶,表头端叫栈底,没有数据节点,则叫空栈。 特点:后进先出(先进后出) - 栈的表现形式
- 因为栈只能在表尾进行插入(入栈)和删除(出栈),因此在写可操作函数时,没有头删头插等
- 结构体设计
struct Stack
{
第一个数据成员:ELEM_TYPE *base (指针类型,用来接收malloc从堆里申请的一整块连续的空 间)
第二个数据成员:int top (栈顶指针,但不用刻板的认为一定是指针类型)(即就是需要一个变量,既能表示下一个数据的插入位置,又能表示有多少个有效值
第三个数据成员:int stack_size(存储当前容量的大小)
};
注意:① base称为栈底指针,在顺序栈中,它始终指向栈底的位置, 如果base为 NULL,则表明栈结构不存在 ② top为栈顶指针,其初始值指向栈底,即top=base可作为栈空的标记,每当插入 新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1 5. 子函数想影响父函数,必须取地址加解引用。 6. 代码 stack.h头文件
#pragma once
#define INIT_SIZE 10
typedef int ELEM_TYPE;
typedef struct stack
{
ELEM_TYPE* base;
int top;
int stack_size;
}Stack,*PStack;
void Init_stack(struct stack* ps);
bool Push(struct stack* ps,ELEM_TYPE val);
bool Pop(PStack ps, ELEM_TYPE *rtval);
bool Top(PStack ps, ELEM_TYPE* rtval);
bool Isempty(PStack ps);
bool Isfull(PStack ps);
void Inc(PStack ps);
int Get_length(PStack ps);
void Clear(PStack ps);
void Destroy(PStack ps);
void Show(PStack ps);
stack.cpp头文件
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"stack.h"
void Init_stack(struct stack* ps)
{
assert(ps != NULL);
if (ps == NULL)
{
return;
}
ps->base = (ELEM_TYPE*)malloc(INIT_SIZE * sizeof(struct stack));
ps->top = 0;
ps->stack_size = INIT_SIZE;
}
bool Push(struct stack* ps, ELEM_TYPE val)
{
assert(ps != NULL);
if (ps == NULL)
{
return false;
}
if (Isfull(ps))
{
Inc(ps);
}
ps->base[ps->top] = val;
ps->top++;
return true;
}
bool Pop(PStack ps, ELEM_TYPE* rtval)
{
assert(ps != NULL);
if (ps == NULL)
{
return false;
}
if (Isempty(ps))
{
return false;
}
ps->top--;
*rtval = ps->base[ps->top];
return true;
}
bool Top(PStack ps, ELEM_TYPE* rtval)
{
assert(ps != NULL);
if (ps == NULL)
{
return false;
}
if (Isempty(ps))
{
return false;
}
*rtval = ps->base[ps->top - 1];
return true;
}
bool Isempty(PStack ps)
{
return ps->top == 0;
}
bool Isfull(PStack ps)
{
return ps->top == ps->stack_size;
}
static void Inc(PStack ps)
{
assert(ps != NULL);
if (ps == NULL)
{
return;
}
ps->base = (ELEM_TYPE *)realloc(ps->base, ps->stack_size * sizeof(struct stack)*2);
assert(ps->base != NULL);
ps->stack_size *= 2;
}
int Get_length(PStack ps)
{
return ps->top;
}
void Clear(PStack ps)
{
ps->top = 0;
}
void Destroy(PStack ps)
{
assert(ps != NULL);
if (ps == NULL)
{
return;
}
free(ps->base);
ps->base = NULL;
ps->stack_size = ps->top = 0;
}
void Show(PStack ps)
{
for (int i = 0; i < ps->top; i++)
{
printf("%d ", ps->base[i]);
}
printf("\n");
}
main主函数
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"stack.h"
int main()
{
struct stack ps;
Init_stack(&ps);
for (int i = 0; i < 15; i++)
{
Push(&ps, i + 1);
}
Show(&ps);
printf("length=%d\n", Get_length(&ps));
printf("stack_size=%d\n", ps.stack_size);
ELEM_TYPE tmp;
bool tag1 = false;
tag1 = Pop(&ps, &tmp);
if (tag1)
{
printf("tmp=%d\n", tmp);
}
Show(&ps);
ELEM_TYPE tmp2;
bool tag2 = Top(&ps, &tmp2);
if (tag2)
{
printf("tmp2=%d\n", tmp2);
}
Show(&ps);
Clear(&ps);
printf("length=%d\n", Get_length(&ps));
printf("stack_size=%d\n", ps.stack_size);
Destroy(&ps);
return 0;
}
运行结果:
|