1.栈的简介
栈是一种特殊的线性表,它的特点是只能从一端添加或者删除数据(压栈\弹栈)这一段被称为栈顶.而无法操作的一端称为栈底.这种操作的特点被称为先进后出
构造栈一般用线性表,当然链表也可以,但是用线性表相对来说比较简单.
2.栈的基本操作
- 栈的初始化
- 压栈(入栈)
- 弹栈(出栈)
- 获取栈的大小
- 判断栈是否为空
- 遍历打印栈的所有元素
- 销毁栈,主要是要free掉malloc申请的空间
3.栈的代码实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define MAX_INIT_SIZE 10;
typedef int Datatype;
typedef struct Stack{
Datatype* arr;
int _size;
int _capacity;
} Stack ,*PStack;
void InitStack(PStack s){//初始化栈
assert(s);//因为用了malloc所以要判断
s->_capacity = MAX_INIT_SIZE;
s->arr = (Datatype*)malloc(sizeof(Datatype)*s->_capacity);//不知道数组里有什么元素,所以先申请一下空间
s->_size = 0;
}
void StackPush(PStack ps,Datatype data){//压栈
assert(ps);
ps->arr[ps->_size] = data;
++ps->_size;
return;
}
void Stackpop(PStack ps) {//弹栈
assert(ps);
--ps->_size;
return;
}
int StackSize(PStack ps) {//获取栈的大小
assert(ps);
return ps->_size;
}
int StackEmpty(PStack ps) {//判断栈是否为空
assert(ps);
if (ps->_size){
return 0;
}
else {
return 1;
}
}
void StackDestroy(Stack* ps) {//销毁栈,主要是要free掉malloc申请的空间
assert(ps);
free(ps);
}
void PrintStack(PStack ps) {//遍历打印栈
assert(ps);
for (int i = 0; i < ps->_size; ++i) {
printf("%u ", ps->arr[i]);
}
printf("\n");
return;
}
int main (){
PStack stacks1=(PStack)malloc(sizeof(Stack));
InitStack(stacks1);
StackPush(stacks1, 1);
StackPush(stacks1, 2);
StackPush(stacks1, 3);
StackPush(stacks1, 4);
StackPush(stacks1, 5);
PrintStack(stacks1);
printf("size of stack:%d\n", StackSize(stacks1));
Stackpop(stacks1);
StackPush(stacks1, 6);
PrintStack(stacks1);//测试代码
system("pause");
return 0;
}