栈的易错点:
1.当栈中没有元素时,称为空栈,此时top=base=0。
2.非空栈中的栈顶指针始终在栈顶元素的下一个位置。
顺序栈
结构体
1.top记录栈顶位置
2. 栈底数组base【】
Status InitStack(SqStack &s)
{
s=(SElemType *)malloc(sizeof(SElemType));
if(s.base==NULL) return OVERFLOW;
s.top=0;
return OK;
}
初始化
1.给空栈base创建空间
2.初始化栈顶top为0
Status InitStack(SqStack &s)
{
s.base=(SElemType *)malloc(sizeof(SElemType));
if(s.base==NULL) return OVERFLOW;
s.top=0;
return OK;
}
判空
1.看top是否为0,初始空栈top=0
栈顶指针top始终在栈顶元素的下一个位置
//判断栈是否为空
int StackEmpty(SqStack s)
{
if(s.top==0) return 1; //空为1
else return 0; //不空为0
}
栈的长度(栈中元素)
类比数组(从0开始存储)
int GetLength(SqStack &s)
{
return s.top;
}
清空栈(逻辑上)
1.栈顶指针top=0,即为空栈
Status ClearStack(SqStack &s)
{
s.top=0;
return OK;
}
销毁栈(物理上)
1.栈顶top=0
2.栈底指针base=NULL(指向空)
Status DestroyStack(SqStack &s)
{
if(s.base)
{
free(s.base);
s.base=NULL;
s.top=0;
}
return OK;
}
入栈
1.判断是否溢出
2.入栈base【】
3.top指针++
Status Push(SqStack &s,SElemType e)
{
if(s.top==MAXSIZE) return ERROR; //栈满跳出
s.base[s.top]=e; //入栈
s.top++;
return OK;
}
出栈
1.是否为空,top=0?
2.出栈base【】
3.栈顶指针top--
tip:以&e形式返回
Status Pop(SqStack &s,SElemType &e) //将删除的元素用e返回
{
if(s.top==0) return ERROR;
s.top--;
e=s.base[s.top];
return OK;
}
输出栈内元素
1.top不是指针类型,直接用 i 遍历,左开右闭【0,top)
void printStack(SqStack s)
{
int i=0;
while(i<s.top)
{
printf("%d",s.base[i]);
i++;
}
printf("\n");
}
链式栈
结构体
1.数据域+指针域
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
} StackNode,*LinkStack;
入栈
1.建立新结点+开辟空间
2.连接到栈中
Status Push(LinkStack &s,SElemType e) //s为指向栈顶的指针
{
StackNode *p; //建立指针,遍历链表栈
p=(StackNode*)malloc(sizeof(StackNode)); //开辟空间
if(p!=NULL) //开辟空间成功
{
p->data=e; //将e存入结点
p->next=s;//将新结点插入栈顶之前
s=p; //将插入结点作为栈顶
return OK;
}
return ERROR;
}
出栈,删除的元素用e返回
1.判断栈s是否为空
2.建立新节点p存储删除结点的地址*next和值data
3.栈顶后退s=s->next;
4.删除结点,释放空间free(p)
Status Pop(LinkStack &s,SElemType &e)
{
StackNode *p;
if(s!=NULL) //该栈顶不为空
{
p=s; //保存被删除结点的地址
e=p->data; //被删除结点的地址所指向的数据e
s=s->next; //
free(p); //释放已删除结点空间
return OK;
}
else
{
return ERROR;
}
}
判空
1.指针s==NULL(等价于top==0)
Status StackEmpty(LinkStack s)
{
if(s==NULL) return 1;
else return 0;
}
栈的长度(元素个数)
1.建立遍历指针p,从s指针开始遍历直到NULL
2.计数器cnt++
int GetLength(LinkStack s)
{
StackNode *p=s;
int cnt=0;
while(p)
{
cnt++; //计数
p=p->next;
}
return cnt;
}
输出
1.建立遍历指针p,从s栈顶开始,直到NULL
void PrintStack(LinkStack s)
{
StackNode *p; //结点指针
p=s;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
销毁栈
1.从头结点s依次遍历,并释放空间
2.p始终代替s(被删除)
Status DestroyStack(LinkStack &s) //栈顶地址
{
StackNode *p; //建立指针,遍历链表栈
p=s; //将栈顶地址给p
while(p!=NULL) //
{
s=s->next; //栈顶往下遍历
free(p); //释放结点空间
p=s; //p始终代替s指向栈顶元素
}
s=NULL;
return OK;
}
获取栈顶元素
Status GetTop(LinkStack s,SElemType &e) //获取元素后以e返回
{
if(s!=NULL) //栈顶存在元素
{
e=s->data; //值赋给e
return OK;
}
else
{
return ERROR;
}
}