2018/2/9
数据结构
1.关于栈的简单认识
1.栈本质上也是一种线性表,只不过规定只能在表尾进行修改
2.栈数据的顺序是后进先出(Last in First out)
2.基本操作
1,对栈的定义
1.对于定义栈,需要指向栈底的头指针top和指向栈顶的尾指针base和栈的最大可容量
typedef struct
{
ElemType *base;//指向栈底(表头)的指针变量
ElemType *top;//指向栈顶(表尾)的指针变量
int stackSize;//表示当前栈的最大可容量
}sqStack;
2.对栈的创建
注意怎样动态分配空间
/*创建一个栈*/
#define STACK_INIT_SIZE 100//栈的初始化空间为100
void initStack(sqStack *s)
{
/*malloc后面的其实就是开辟空间的大小,本次中为100*sizeof(int)个大小的空间*/
s->base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if (!s->base)
{
exit(0);
}
else
{
s->top = s->base;//栈顶指针等于栈底指针
s->stackSize = STACK_INIT_SIZE;
}
}
3.入栈
注意判断动态分配空间的情况
/*入栈操作*/
#define SATCKINCREMRNT 10//追加空间
void Push(sqStack*s, ElemType e)
{
/*判断栈是否已经满了*/
if (s->top - s->base >= s->stackSize)//代表满了,因此增加空间
{
s->base = (ElemType*)realloc(s->base, (s->stackSize + SATCKINCREMRNT) * sizeof(ElemType));
//realloc(拷贝原有)
if (!s->base)
{
exit(0);
}
s->top = s->base + s->stackSize;//动态分配空间后栈顶指针的位置
s->stackSize = s->stackSize + SATCKINCREMRNT;
}
*(s->top) = e;
s->top++;//top指针位置++
}
4.出栈
/*出栈操作*/
void Pop(sqStack*s, ElemType *e)
{
if (s->top = s->base)
return 0;// 栈底指针等于栈顶指针,说明是空栈,直接返回
*e = *--(s->top);//否则有数的情况下 栈顶指针--
}
5.清空栈
s->top=s->base
/*清空一个栈*/
//就是将栈的元素全部作废,但是栈本身的物理空间没有改变;
void ClearStack(sqStack *s)
{
s->top = s->base;
}
6.完全销毁栈
循环free掉s->base,再把s->top=s->base=NULL,注意把栈的容量调为0
void DestroyStack(sqStack *s)
{
int i, len;
len = s->stackSize;
for (i = 0; i < len; i++)
{
free(s->base);
s->base++;
}
s->base = s->top = NULL;
s->stackSize = 0;
}
7.返回栈的容量
栈的容量等于s.top-s.base
int Stacklen(sqStack s)
{
return (s.top - s.base);//结果是几个元素(两个相同类型变量地址相减/单个字节空间)
}