#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
#define STACK_INT_SIZE 10 //存储空间初始分配量
#define STACKINCREMENT 5 //存储空间分配增量
typedef int ElemType;
typedef struct
{
ElemType *top; //栈顶指针
ElemType *base; //栈底指针
int stacksize; //当前分配的存储空间
}Sqstack;
/*栈的初始化*/
int InitStack(Sqstack *s)
{
s->base = (ElemType*)malloc(STACK_INT_SIZE*sizeof(ElemType));
if(!s->base) //申请空间失败
{
return ERROR;
}
s->top = s->base; //置为空栈
s->stacksize = STACK_INT_SIZE; //设置当前栈空间大小
}
/*
入栈
入栈之前先要判断栈是否已满,判断栈是否满的语句s->top-s->base>=s->stacksize
如果已满则需要重新申请增加空间,同时栈顶指针的位置也需要发生变化 s->top+1
*/
int Push(Sqstack *s,ElemType e) //插入的e是一个具体的值
{
if(s->top - s->base >= s->stacksize)
{
s->base = (ElemType*)realloc(s->base,s->stacksize+STACKINCREMENT);
//realloc函数的用法
//指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)
if(!s->base)return ERROR; //申请空间失败
s->top = s->base + s->stacksize; //重新设置当前栈顶指针
s->stacksize += STACKINCREMENT; //分配空间大小的改变
/*
s->stacksize += STACKINCREMENT;
s->top = s->base + s->stacksize;
当空间满的时候,需要将栈顶指针移到最顶端,如果先执行
栈顶指针就指向后来申请空间的顶端,指向发生错误。
*/
}
//e = *s->top; 等号两边赋值发生错误
//*s->top = e; (1)
//s->top++; (2) 插入数据后栈顶指针向上移
*s->top++ = e; //将(1)和(2)句合成一句,参照i++
return OK;
}
/*
出栈
出栈首先要判断栈是否为空,判断栈是否为空的语句
s->top == s->base;
如果不为空,则出栈要需要将栈顶指针下移
*/
int Pop(Sqstack *s,ElemType *e)
//完成元素的出栈,只需要将地址传进去就可以
//不同于元素的入栈
{
if(s->top == s->base)return ERROR; //判断栈是否为空
//s->top--; 修改栈顶指针-1
//*e = *s->top; e返回出栈元素的值
*e = *--s->top;
return OK;
}
int Gettop(Sqstack *s,ElemType *e)
{
if(s->top == s->base)return ERROR;
*e = *(s->top-1); //只取栈顶元素值,不改变栈顶指针指向
return OK;
}
#include <stdlib.h>
#define ERROR 0
#define OK 1
#define STACK_INT_SIZE 10 //存储空间初始分配量
#define STACKINCREMENT 5 //存储空间分配增量
typedef int ElemType;
typedef struct
{
ElemType *top; //栈顶指针
ElemType *base; //栈底指针
int stacksize; //当前分配的存储空间
}Sqstack;
/*栈的初始化*/
int InitStack(Sqstack *s)
{
s->base = (ElemType*)malloc(STACK_INT_SIZE*sizeof(ElemType));
if(!s->base) //申请空间失败
{
return ERROR;
}
s->top = s->base; //置为空栈
s->stacksize = STACK_INT_SIZE; //设置当前栈空间大小
}
/*
入栈
入栈之前先要判断栈是否已满,判断栈是否满的语句s->top-s->base>=s->stacksize
如果已满则需要重新申请增加空间,同时栈顶指针的位置也需要发生变化 s->top+1
*/
int Push(Sqstack *s,ElemType e) //插入的e是一个具体的值
{
if(s->top - s->base >= s->stacksize)
{
s->base = (ElemType*)realloc(s->base,s->stacksize+STACKINCREMENT);
//realloc函数的用法
//指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)
if(!s->base)return ERROR; //申请空间失败
s->top = s->base + s->stacksize; //重新设置当前栈顶指针
s->stacksize += STACKINCREMENT; //分配空间大小的改变
/*
s->stacksize += STACKINCREMENT;
s->top = s->base + s->stacksize;
两条语句不能颠倒的原因:
realloc
进行再分配空间的时候,如果在原来的基础上还有需要空间大小,那么
得到的是连续的内存空间,如果空间不够,那就需要重新开辟一块空间。地址发生变化。
一开始进行初始化的时候,栈顶指针和栈底指针指向同一位置当空间满的时候,需要将栈顶指针移到最顶端,如果先执行
s->stacksize += STACKINCREMENT;
那么后面执行s->top = s->base + s->stacksize; 的时候栈顶指针就指向后来申请空间的顶端,指向发生错误。
*/
}
//e = *s->top; 等号两边赋值发生错误
//*s->top = e; (1)
//s->top++; (2) 插入数据后栈顶指针向上移
*s->top++ = e; //将(1)和(2)句合成一句,参照i++
return OK;
}
/*
出栈
出栈首先要判断栈是否为空,判断栈是否为空的语句
s->top == s->base;
如果不为空,则出栈要需要将栈顶指针下移
*/
int Pop(Sqstack *s,ElemType *e)
//完成元素的出栈,只需要将地址传进去就可以
//不同于元素的入栈
{
if(s->top == s->base)return ERROR; //判断栈是否为空
//s->top--; 修改栈顶指针-1
//*e = *s->top; e返回出栈元素的值
*e = *--s->top;
return OK;
}
int Gettop(Sqstack *s,ElemType *e)
{
if(s->top == s->base)return ERROR;
*e = *(s->top-1); //只取栈顶元素值,不改变栈顶指针指向
return OK;
}