栈和队列都常用的数据结构,这里使用C语言实现栈和队列,
一、栈
栈:是一种特殊的线性表,其只允许在一端出数据和入数据,插入数据和删除数据的一端加栈顶,另一端叫栈底。其数据遵守先进后出的原则(Last in First out)。
因为这个特点那么如果进入一段数据是 1 2 3 4 5,那么其出数据就是反的 5 4 3 2 1。
压栈(push):往栈顶插入数据。
出栈(pop):把数据在栈顶删除。
实现:
typedef int STdatatype;
typedef struct stack
{
STdatatype *arr;
int top;
int capacity;
}stack;
//初始化
void StackInit(stack* ps);
//销毁堆栈
void StackDestory(stack* ps);
//压栈
void StackPush(stack* ps, STdatatype x);
//出栈
void StackPop(stack* ps);
//取栈顶的值
STdatatype StackTop(stack* ps);
//判断栈是否为空
bool StackIsEmpty(stack* ps);
//栈的长度
int StackSize(stack* ps);
void StackInit(stack* ps)
{
assert(ps);
ps->arr = NULL;
ps->capacity = 0;
ps->top = 0;
}
void StackDestory(stack* ps)
{
assert(ps);
free(ps->arr);
ps->arr = NULL;
ps->capacity = 0;
ps->top = 0;
}
void StackPush(stack* ps, STdatatype x)
{
assert(ps);
if (ps->capacity == ps->top){
int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
STdatatype* p = (STdatatype*)realloc(ps->arr, sizeof(STdatatype)* newCapacity);
if (p==NULL)
{
perror("申请内存失败\n");
exit(0);
}
ps->capacity = newCapacity;
ps->arr = p;
}
ps->arr[ps->top] = x;
ps->top++;
}
void StackPop(stack* ps)
{
assert(ps);
assert(!StackIsEmpty(ps));
ps->top--;
}
STdatatype StackTop(stack* ps)
{
assert(ps);
assert(!StackIsEmpty(ps));
return ps->arr[ps->top-1];
}
bool StackIsEmpty(stack* ps)
{
assert(ps);
return ps->top == 0;
}
int StackSize(stack* ps)
{
assert(ps);
assert(!StackIsEmpty(ps));
return ps->top;
}
这里使用了数组来模拟实现栈的特点。
测试:
PS:栈是不能被遍历的,要访问下一个数据,必须把现在的数据弹出栈顶。
PS:但是,还是要注意,并不是遍历的时候,出数据就只能是5 4 3 2 1,如果这里一边访问一边出数据,数据还是顺序的。
举例:
二、队列
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 (First In First Out)
入队列:进行插入操作的一端称为队尾。
出队列:进行删除操作的一端称为队头。
因为其只能在队头出数据,所以进入一段数据 1 2 3 4 5,那么出数据的顺序也该是 1 2 3 4 5。
实现:
typed