【数据结构】栈(上)2021-11-14

今天有点忙,就少更点内容吧。
今天学栈。
栈是限定仅在表尾进行插入和删除操作的线性表。
栈有入栈和出栈两种操作,遵照先入后出原则,就像弹匣中的子弹一样。

【数据结构】栈(上)2021-11-14
单栈,有最大容量和一个栈顶,每个栈空间容纳一个元素,栈顶就是最后进入的元素,也是表尾

#include <stdio.h>
#define MAXSIZE 100 
#define OK 1
#define ERROR 0
typedef int SElemType;
typedef int Status;
typedef struct
{
	SElemType data[MAXSIZE];
	int top;
}SqStack;

入栈/压栈/进栈
先判断是否满栈,如未满,则栈顶向上移一位,将数据存入新栈顶

出栈/弹栈
先判断是否满栈,如未满,则将栈顶数据传给指针,栈顶向下移一位。
注意入栈和出栈的操作顺序有差异。

 Status Push(SqStack *s, SElemType e)
 {
 	if(s->top==MAXSIZE-1)
 	    return ERROR;
 	s->top++;
 	s->data[s->top]=e;
 	return OK;
 }
 
 Status Pop(SqStack *s, SElemType *e)
 {
 	if(s->top==-1)
 	    return ERROR;
 	*e=s->data[s->top];
 	s->top--;
 	return OK;
 }

两栈共享空间:
两个栈合并,有两个栈顶,一个从0开始加,一个从最大值开始减。
【数据结构】栈(上)2021-11-14

typedef struct 
 {
 	SElemType data[MAXSIZE];
 	int top 1;
 	int top 2;
 }SqDoubleStack;

共享栈入栈:
由于现在有两个栈顶,判断满栈的方法不同。
判断栈顶1加1是否等于栈顶2.
所以用此方法判断是否满栈,再判断要入哪一个栈(StackNumber),接着栈顶上移(相对中心),数据赋值。

Status DPush(SqDoubleStack *s,SElemType e,int StackNumber)
 {
 	if(s->1+1==s->2)
 	    return ERROR;
 	if(StackNumber==1)
 	    s->data[++s->top1]=e;
 	else if(StackNumber==2)
 	    s->data[--s->top2]=e;
 	return OK;
 }

共享栈出栈
先判断要出哪一个栈,再判断是否栈为空,
之后,先取数据再栈顶下移(相对中心)

Status DPop(SqDoubleStack *s,SElemType *e,int StackNumber)
{
	if(StackNumber==1)
	{
		if(s->top1==-1)
		    return ERROR;
		*e=s->data[s->top1--]
    }
    else if(StackNumber==2)
    {
    	if(s->2==MAXSIZE)
    	    return ERROR;
    	*e=s->data[s-top>2++];
    	
    }
    return OK;
}


——————————————————————————————————————————————————
坚持写博客的第三天,上学真忙啊,简直是忙里偷闲
每日一名言:
希望之花,盛开在梦想的道路上。
The flower of hopeness is blessing on the road of dream.

上一篇:@Validated和@Valid校验参数区别


下一篇:字符串的重新排列