顺序栈和链式栈

栈的易错点:

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;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值