(1)栈:其特点是数据遵循“先进后出”的原则,是一个由低地址向高地址增长的。
(2)分类:定长顺序栈、不定长顺序栈、链式栈
(3)代码如下:
#define SIZE 10
typedef int ElemType;
typedef struct Stack
{
ElemType elem[SIZE];
int top;//栈顶指针,标记当前可以存放数据的下标
}Stack,*PStack;
//初始化
void Init_Stack(PStack ps)
{
assert(ps!=NULL);
ps->top=0;
}
//判空
bool IsEmpty(PStack ps)
{
return ps->top == 0;
}
//判满
static bool IsFull(PStack ps)
{
return ps->top == SIZE;
}
//入栈
bool push(PStack ps,int val)
{
if(IsFull(ps))
{
return false;
}
ps->elem[ps->top++]=val;
return true;
}
//获取栈顶元素的值,但不删除
bool top(PStack ps,int *rtval)
{
if(IsEmpty(ps))
{
return false;
}
*rtval=ps->elem[ps->top-1];//top可以存放数据的下标 所以需要减一
return true;
}
//获取栈顶元素的值,且删除
bool pop(PStack ps,int *rtval)
{
if(IsEmpty(ps))
{
return false;
}
*rtval=ps->elem[--ps->top];
return true;
}
//清空
void Clear(PStack ps)
{
ps->top = 0;
}
int main()
{
Stack ps;
Init_Stack(&ps);
for(int i=0;i<10;i++)
{
push(&ps,i);
}
int tmp;
while(!IsEmpty(&ps))
{
pop(&ps,&tmp);
printf("%d ",tmp);
}
printf("\n");
//Show(&st);
return 0;
}*/
/*
链式栈 与单链表相同,在操作时用到的都是单链表的操作;
*/
/*
typedef struct SNode
{
int data;
struct SNode *next;//链式栈的栈顶在表头
}SNode,*SStack;
void InitStack(SStack ps)
{
assert(ps!=NULL);
ps->next=NULL;
}
//入栈-头插
bool Push(SStack ps,int val)
{
assert(ps!=NULL);
if(ps==NULL)
{
return false;
}
SNode *p=(SNode*)malloc(sizeof(SNode));
p->data=val;
p->next=ps->next;
ps->next=p;
return true;
}
//入栈-尾插
bool push(SStack ps,int val)
{
assert(ps!=NULL);
if(ps==NULL)
{
return false;
}
SNode *p;
for(p=ps;p->next!=NULL;p=p->next);
SNode *q=(SNode *)malloc(sizeof(SNode));
q->data=val;
q->next=p->next;
p->next=q;
return true;
}
bool IsEmpty(SStack ps)
{
return ps->next==NULL;
}
//获取栈顶元素的值,但不删除
bool top(SStack ps,int *rtval)
{
if(IsEmpty(ps))
{
return false;
}
return *rtval=ps->next->data;
}
//获取栈顶元素的值,且删除
bool pop(SStack ps,int *rtval)
{
if(IsEmpty(ps))
{
return false;
}
SNode *p = ps->next;
//头结点指向当前节点的下一个
ps->next = p->next;
//得到元素后并且删除此节点
*rtval = p->data;
free(p);//释放当前节点
return true;
}
//销毁栈 就是单链表的现货
void Destroy(SStack ps)
{
SNode *p;
while(ps->next)
{
p=ps->next;
ps->next=p->next;
free(p);
}
}
void Clear(SStack ps)
{
Destroy(ps);
}