第二章:栈
-
后进先出(LIFO, Last In First Out),
或先进后出(FILO, First In Last Out). -
如果后放入的数据先处理,一般使用栈。
2.1顺序栈
顺序栈类型定义
typedef struct
{
Elemtype data[MaxSize];
int top; //栈顶指针。初始值为-1;top=maxsize-1时栈满
}SqStack;
初始化栈
void InitStack(SqStack* &s)
{
s=(SqStack*)malloc(sizeof(SqStack));
s->top=-1;
}
销毁栈
void DestroyStack(SqStack* &s)
{
free(s);
}
判断空栈
bool StackEmpty(SqStack* s)
{
return (s->top==-1);
}
进栈
在栈不满的条件下,先将栈指针增1,然后在该位置上插入元素e。
bool Push(SqStack* &s, Elemtype e)
{
if(s->top==MaxSize-1)
return false;
s->top++;
s->data[s->top]=e;
return true;
}
出栈
在栈不为空的条件下,先将栈顶元素赋给e,然后将栈指针减1。
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;
}
2.2链栈
- 一种特殊的单链表;
- 不考虑栈满;进栈、退栈按照头插法;
链栈类型定义
typedef struct LinkStNode
{
Elemtype data;
struct LinkStNode *next;
}LinkStNode;
初始化栈
void InitStack(LinkStNode* &s)
{
s=(LinkStNode*)malloc(sizeof(LinkStNode));
s->next=NULL;
}
销毁栈
void DestroyStack(LinkStNode* &s)
{
LinkStNode *p=s, *q=s->next;
while(q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
判断空栈
bool StackEmpty(LinkStNode* s)
{
return (s->next==NULL);
}
进栈
链栈使用头插法插入结点。
void Push(LinkStNode* &s, Elemtype e)
{
LinkStNode *p;
p=(LinkStNode*)malloc(sizeof(LinkStNode));
p->data=e;
p->next=s->next;
s->next=p;
}
出栈
由于栈是先进后出,(头插法)
所以出栈的元素就是第一个(栈顶元素)。
bool Pop(LinkStNode* &s, Elemtype &e)
{
LinkStNode *p;
if(s->next==NULL)
return false;
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return true;
}
取栈顶元素
bool GetTop(LinkStNode* s, Elemtype &e)
{
if(s->next==NULL)
return false;
e=s->next->data;
return true;
}