顺序栈
存储结构定义
typedef int ElemType;
typedef enum Status{
ERROR = 0,OK = 1
}Status;
typedef struct SqStack{
ElemType *elem;
int top; //用于栈顶指针
int size; // 最大大小
}SqStack;
初始化栈
//顺序栈(基于数组的)
Status initStack(SqStack *s,int sizes) //初始化
{ s->elem = (ElemType *)malloc(sizes * sizeof(ElemType));
if (s->elem == NULL) {
return ERROR;
}
s->top = -1;
s->size = sizes;
t = 1; //表示已经初始化
return OK;
}
判空
Status isEmptyStack(SqStack *s){
return ( s->top == -1 ? OK : ERROR);
}
取得栈顶元素
Status getTopStack(SqStack *s,ElemType *e){
if (s == NULL || s->top == -1) {
return ERROR;
} else {
*e = s->elem[s->top];
}
return OK;
}
清空栈
Status clearStack(SqStack *s) {
s->top = -1;
return OK;
}
销毁栈
Status destroyStack(SqStack *s){
if (s == NULL) {
return ERROR;
}
free(s->elem);
t = 0; //标记栈已经不存在
return OK;
}
获取栈深度
Status stackLength(SqStack *s,int *length){
if(s == NULL){
*length = 0;
return ERROR;
} else {
*length = s->top +1;
}
}
入栈
Status pushStack(SqStack *s,ElemType datas){
if (s == NULL || s->top > s->size) {
return ERROR;
}
s->top++;
s->elem[s->top] = datas;
return OK;
}
出栈
//出栈,并用datas返回其值
Status popStack(SqStack *s,ElemType *datas){
if (s == NULL || s->top == -1) {
return ERROR;
}
*datas = s->elem[s->top];
s->top--;
return OK;
}
遍历栈
void printStack(SqStack *s) {
int l = s->top;
printf("-------该栈为:\n");
while(l != -1 ){
printf("%d->",s->elem[l]);
l--;
}
}
链栈
存储结构定义
typedef int ElemType;
typedef enum Status{
ERROR = 0,OK = 1
}Status;
typedef struct StackNode{
ElemType data;
struct StackNode *next;
}StackNode, *LinkStackPtr;
typedef struct LinkStack{
LinkStackPtr top; //栈顶指针
int count; //栈中元素个数
}LinkStack;
初始化链栈
Status initLStack(LinkStack *s) //初始化
{
s->top = NULL; //保证其为空栈
s->count = 0;
t = 1; //标记已经初始化
return OK;
}
判空
Status isEmptyLStack(LinkStack *s){
return (s->top == NULL? OK : ERROR);
}
取栈顶结点
Status getTopLStack(LinkStack *s,ElemType *e){
if (isEmptyLStack(s)) {
return ERROR;
}
*e = s->top->data;
return OK;
}
入栈
// 类似链表的插入操作
Status pushLStack(LinkStack *s,ElemType datas){
LinkStackPtr p = (StackNode *)malloc(sizeof(StackNode));
if(p == NULL){
return ERROR;
} else {
p->data = datas;
p->next = s->top;
s->top = p;
s->count++;
return OK;
}
}
出栈
//类似链表删除操作
Status popLStack(LinkStack *s,ElemType *datas){
if(isEmptyLStack(s)){
return ERROR;
} else {
LinkStackPtr p = s->top; //将栈顶节点赋给p
*datas = p->data;
s->top = p->next; //指针下移
free(p);
s->count--;
return OK;
}
}
清空链栈
Status clearLStack(LinkStack *s){
ElemType *a = (ElemType *)malloc(sizeof(ElemType)); //设置一个值存储每次清空的值
if(a == NULL){
return ERROR;
}
while(!isEmptyLStack(s)){ //每次先判断是否为空栈再操作
popLStack(s,a); //每次出栈一个直至空栈
}
s->count = 0;
return OK;
}
销毁链栈
Status destoryLStack(LinkStack *s){
if(isEmptyLStack(s)){
free(s);
t = 0;
return OK;
}
clearLStack(s); //先清空栈再释放空间
free(s);
t = 0;
return OK;
}
遍历链栈
void printLStack(LinkStack *s) {
LinkStackPtr p = s->top; //将栈顶节点赋给p
printf("-------该栈为:\n");
while(p != NULL){
printf("%d->",p->data);
p = p->next; //指针下移
}
}