//顺序栈的实现
//清空了,只是栈顶指针从头开始,栈所占用空间已在。销毁,就是栈内存释放,这个栈就死亡了
//链表形式的需要逐个结点释放。如果是动态分配,整体一次释放
#include <stdio.h>
#define STACR_INIT_SIZE 100
#define STACR_ADD_SIZE 10
typedef char ElemType;
typedef int status;
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}stack;
//初始化栈
status initstack(stack *s)
{
//进行空间分配 给数据成员进行初始化
s->base = (ElemType*)malloc(sizeof(ElemType)*STACR_INIT_SIZE);
if (!s->base) {
return 0;
}
s->top = s->base;
s->stacksize = STACR_INIT_SIZE;
return 1;
}
//销毁栈
status destory(stack *s)
{
free(s->base);
}
//清栈
status clearstack(stack *s)
{
s->base = s->top;
}
//检验栈是否为空 是返回0 否返回1
status isStackempty(stack s)
{
if (s.base == s.top) {
return 0;
}
return 1;
}
//返回栈的长度 已使用的长度 ?还是栈初始化的长度 ?
int stacklength(stack s)
{}
//返回栈顶元素的数据存储部分
status gettop(stack s, ElemType *e)
{
*e = *s.top;
return 1;
}
//进行压栈
status push(stack *s, ElemType e)
{
//判断栈是否已满
if (s->top - s->base >= s->stacksize)
{
s->base = (ElemType*)realloc(s->base, sizeof(ElemType)*(s->stacksize + STACR_ADD_SIZE));//会复制原来的数据 但是指针的指向呢
if (!s->base){
return 0;
}
s->top = s->base + s->stacksize;//头指针的指向要重新确定
s->stacksize += STACR_ADD_SIZE;//更新长度
}
//s->top= (ElemType*)malloc(sizeof(ElemType)); 已经进行过内存的分配 直接用
*s->top = e;//赋值
s->top++;//指针后移
return 1;
}
//弹出栈顶
status Pop(stack *s, ElemType *e)
{
//弹出之前要判断栈是否为空
if (s->base == s->top)
{
return 0;
}
//语句实现的顺序我还不懂 *e=*--s->top
s->top--;
*s->top = *e;
return 1;
}
//清空了,只是栈顶指针从头开始,栈所占用空间已在。销毁,就是栈内存释放,这个栈就死亡了
//链表形式的需要逐个结点释放。如果是动态分配,整体一次释放
#include <stdio.h>
#define STACR_INIT_SIZE 100
#define STACR_ADD_SIZE 10
typedef char ElemType;
typedef int status;
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
}stack;
//初始化栈
status initstack(stack *s)
{
//进行空间分配 给数据成员进行初始化
s->base = (ElemType*)malloc(sizeof(ElemType)*STACR_INIT_SIZE);
if (!s->base) {
return 0;
}
s->top = s->base;
s->stacksize = STACR_INIT_SIZE;
return 1;
}
//销毁栈
status destory(stack *s)
{
free(s->base);
}
//清栈
status clearstack(stack *s)
{
s->base = s->top;
}
//检验栈是否为空 是返回0 否返回1
status isStackempty(stack s)
{
if (s.base == s.top) {
return 0;
}
return 1;
}
//返回栈的长度 已使用的长度 ?还是栈初始化的长度 ?
int stacklength(stack s)
{}
//返回栈顶元素的数据存储部分
status gettop(stack s, ElemType *e)
{
*e = *s.top;
return 1;
}
//进行压栈
status push(stack *s, ElemType e)
{
//判断栈是否已满
if (s->top - s->base >= s->stacksize)
{
s->base = (ElemType*)realloc(s->base, sizeof(ElemType)*(s->stacksize + STACR_ADD_SIZE));//会复制原来的数据 但是指针的指向呢
if (!s->base){
return 0;
}
s->top = s->base + s->stacksize;//头指针的指向要重新确定
s->stacksize += STACR_ADD_SIZE;//更新长度
}
//s->top= (ElemType*)malloc(sizeof(ElemType)); 已经进行过内存的分配 直接用
*s->top = e;//赋值
s->top++;//指针后移
return 1;
}
//弹出栈顶
status Pop(stack *s, ElemType *e)
{
//弹出之前要判断栈是否为空
if (s->base == s->top)
{
return 0;
}
//语句实现的顺序我还不懂 *e=*--s->top
s->top--;
*s->top = *e;
return 1;
}