数据结构学习笔记:顺序栈与链栈

顺序栈

typedef struct    
{    
    int data[maxSize];   //存放栈中元素  
    int top;    //栈顶指针  
} SqStack;   //顺序栈类型定义  

1 顺序栈要素:两个特殊状态与两个操作   对于顺序栈st

(1)两个状态:

1)栈空:

st.stop == -1

2)栈满:

st.top == maxSize - 1

(2)两个操作

1)元素x进栈操作

++(st.top);
st.data[st.top] = x ;
//  也可写成一行  即  st.data[++(st.top)] = x;

2)元素x出栈操作

x = st.data[st.top] ;
-- (st.top);
//   或者   x = st.data[(st.top) -- ] ;
2 顺序栈基本操作

注意:当前栈是否为空,空时不出;是否为满,满时不进。

//初始化栈
void initStack(SqStack &st)
{
	st.top = -1;
}

//判断栈空
int isEmpty(SqStack st)
{
	if ( -1 == st.top )
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

//进栈
int Push(SqStack &st, int x)
{
	if ( (maxSize - 1 ) == st.top )
	{
		return 0;
	}
	//先移动指针,再进栈
	++ (st.top);              //<span style="color:#ff0000;"> ++a 总比 a++ 执行效率要高。在两者等效的情况下,总是使用 ++a</span>
	st.data[ st.top] = x;	  // st.data[ ++ (st.top)] = x;
	return 1;				  //
}

//出栈
int Pop(SqStack &st, int &x)
{
	if ( -1 == st.top)
	{
		return 0;
	}
	//先出栈,再移动指针
	x =  st.data[ st.top]; // x =  st.data[ st.top -- ];
	(st.top) --	;			//
	return 1;
}

链栈:

typedef struct LNode    
{    
    int data;    
    struct LNode *next;  //指向后继结点的指针    
}LNode;  //链栈结点定义  

1 链栈要素:两个状态,两个操作   对于链栈 lst

(1)两个状态

1)栈空:

lst->next = NULL

2)栈满

  不存在栈满的状态。链栈可以利用的结点数与内存大小有关,当内存满时,为栈满

(2)两个操作

1)元素(由指针p所指)进栈操作

p->next = lst->next;
lst->next = p;      //头插入法建立链表的插入操作

2)出栈操作(出栈元素保存在x中)

p = lst->next;
x = p->data;
lst->next = p->next;
free(p);   // 单链表的删除操作

2 链栈基本操作

//初始化链栈
void initStack(LNode *&lst)
{
	lst = (LNode*) malloc (sizeof(LNode));
	lst->next = NULL;
}

//判断栈空
int isEmpty(LNode *lst)
{
	if (NULL == lst->next)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

//进栈
void Push(LNode *&lst, int x)
{
	LNode *p;
	p = (LNode *)malloc(sizeof(LNode));
	p->next = NULL;

	p->data = x;
	p->next = lst->next;
	lst->next = p;
}

//出栈
int Pop(LNode *&lst, int &x)    //需要改变的变量要用引用型
{
   LNode *p;

   if (NULL == lst->next)
   {
	   return 0;
   }

   p = lst->next;
   x = p->data;
   lst->next = p->next;
   free(p);
   return 1;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值