栈
1、允许进行插入、删除操作的一端叫栈顶
2、表的另一端叫栈底
3、当栈中没有数据元素时称为空栈
4、插入叫进栈或入栈
5、删除叫退栈或出栈
特点:后进先出
顺序栈
typedef struct
{
ElemType data[maxsize];
int top;//栈顶指针
}SqStack;`
初始化栈
void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;}//s为栈指针,top为s所指栈的栈顶指针
销毁栈
void DestroyStack(SqStack *&s)
{
free(s);
}
判断栈是否为空
bool StackEmpty(SqStack *&s)
{
return s->top==-1);
}
进栈
bool push(SqStack *&s,ElemType e)
{
if(s->top==MaxSize-1)
return false;
s->top++;
s->data[s->top]=e;
return true;
}
出栈
bool pop(SqStack *&s,ElemType &e)
{
if(s->top==-1)
return false;
e=s->data[s->top];
s->top--;
return true;
取栈顶元素
bool GetTop(SqStack &*s,ElemType &e)
{
if(s->top==-1)
return false;//栈为空的情况,即栈下溢出
e=s->data[s->top];
return true;
链栈
采用链表存储的栈成为链栈,这里采用带头节点的单链表实现
链栈中数据节点的类型LiStack定义如下:
typedef struct linknode
{
ElemType data;//数据域
struct linknode *next;//指针域
}LiStack;
初始化栈
void initStack(LiStack *&s)
{
s=(LiStack *)malloc(sizeof(LiStack));
s->next=null;
}
销毁栈
void DestroyStack(LiStack *&s)
{
LiStack *p=s,*q=s->next;
while(q!=null)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
判断栈是否为空StackEmpty(s)
bool StackEmpty(LiStack *s)
{
return(s->next==null);
进栈Push(&s,e)
将新数据节点插入到头节点之后(头插法)
void Push(LiStack *&s,ElemType e)
{
LiStack *p;
s=(LiStack *)malloc(sizeof(LiStack));
p->data=e;
p->next=s->next;
s->next=p;
}
出栈Pop(&s,&e)
Pop(LiStack *&s,ElemType &e)
{
LiStack *p;
if(s->next==null)
return false;
p->next=s->next;
e=p->data;
s->next=p->next;
free(p);
}
取栈顶元素
bool GetTop(LiStack *s,ElemType &e)
{
if(s->next==null)
return false;
e=s->next->data;
return true;
}