第三章 栈和队列

3.1 栈

3.1.1 栈的定义

3.1.2 栈的顺序存储结构及其基本运算实现

        假设栈的元素个数最大不超过正整数MaxSize,所有的元素都具有同一数据类型 ElemType ,则可用下列方式来声明顺序栈类型 SqStack:

typedef struct{
	ElemType date[MaxSize];        // 存放栈中的数据元素
	int top;                       // 栈顶指针,即存放栈顶元素data在数组中的下标
}SqStack;                          // 顺序栈类型

       顺序栈的基本运算算法

         1)初始化栈:InitStack(&s)
void InitStack(SqStack *&s){
	s=(SqStack *)malloc(sizeof(SqStack));		//分配一个顺序栈空间,首地址存放在s中 
	s->top=-1;									//栈顶指针置为-1 
}
        2)销毁栈:DestoryStack(&s)
void DestoryStack(SqStack *&s){
	free(s);								
}
        3)判断栈是否为空:StackEmpty(s)
bool StackEmpty(SqStack *s){				
	return (s->top==-1);
}
        4)进栈:Push(&s,e)
bool Push(SqStack *&s,ElemType e){
	if(s->top==MaxSize-1)				//栈满的情况,即栈上溢出 
		return false;
	s->top++;							//栈顶指针增 
	s->date[s->top]=e;					//元素e放在栈顶指针处 
	return true;
}
        5)出栈:Pop(&s,&e)
bool Pop(SqStack *&s,ElemType &e){
	if(s->top==-1)						//栈为空的情况,即栈下溢出 
		return false;
	e=s->date[s->top];					//取栈顶元素 
	s->top--;							//栈顶指针减1 
	return true;
}
        6)取栈顶元素:GetTop(s,&e)
bool GetTop(SqStack *s,ElemType &e){
	if(s->top==-1)						//栈为空的情况,即栈下溢出 
		return false;
	e=s->date[s->top];					//取栈顶元素
	return true;				
}

3.1.3 栈的链式存储结构及其基本运算的实现

        链栈中数据结点的类型 LinkStNode 声明如下 :

typedef struct linknode{
	ElemType data;				 
	struct linknode * next;	
}LinkStNode;

        链栈的基本运算算法

        1)初始化栈:InitStack(&s)
void InitStack(LinkStNode *&s){ 					
	s = (LinkStNode *)malloc(sizeof(LinkStNode));
	s->next = NULL;
}
        2)销毁栈:DestoryStack(&s)
void DestoryStack(LinkStNode *&s){					 
	LinkStNode *pre = s,*p = s->next;			  // pre 指向头结点,p 指向首结点      
	while(p != NULL){							  // 循环到 p 为空			
		free(pre);							      // 释放 pre 结点
		pre = p;							      // pre、p同步后移
		p = pre->next;
	}
	free(pre);								
}
        3)判断栈是否为空:StackEmpty(s)
bool StackEmpty(LinkStNode *s){							
	return (s->next == NULL);
}
        4)进栈:Push(&s,e)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值