数据结构(四)

栈的定义
栈:是一种,只能在一端进行插入和删除操作的线性表。

栈的几个概念
1、栈顶:允许进行插入、删除操作的一端。
2、栈底:表对于可操作一端的另一端。
3、空栈:当栈中没有数据元素时,称为空栈。
4:入栈(进栈):栈的插入操作。
5、出栈(退栈):栈的删除操作。

栈的主要特点:元素后进先出。

栈的几种基本运算:
1、初始化栈,构造一个空栈。
2、销毁栈,释放其空间。
3、判断是否为空栈。
4、进栈。
5、出栈。
6、取栈顶元素。

顺序栈
定义一个顺序栈类型:

typedef struct {
  int data[10];//一个任意数据类型的数组,这里我用的int
  int top; //一个去记录数组下标的数,像一个指针
}SqStack;

我们一般的操作是,将空栈的top先设为-1,当栈内每进一个元素的时候,top++,保证top记录的是栈顶。
所有就有了下面两特点:
1、当空栈的时候top= -1;
2、当满栈的时候top=MaxSize-1 (假设数组长为MaxSize);

顺序栈四要素:
1、栈空条件:top = -1
2、栈满条件:top = MaxSize - 1
3、进栈操作:top++ ;将元素放在top处
4、退栈操作:从top处取出元素 ;top- -

1、初始化栈:

void InitStack(SqStack *&s){
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}//在刚才的基础上构建一个空栈

2、销毁栈:

void DestoryStack(SqStack *&s){
free(s);
} //顺序栈是可以直接free掉的

3、判断栈是否为空

bool StackEmpty(SqStack *s){
return (s->top==-1);
}//只要判断top是否为-1就行了

4、进栈

bool Push(SqStack*&s,int e){
if(s->top==MaxSize-1){
return false;
}
s->top++;
s->data[s->top]=e;
return true;
}

5、出栈

bool Pop(SqStack *&s,int &e){
if(s->top==-1){
return false;
}
e=s->data[s->top];
s->top--;
return true;
}

6、取栈顶元素

bool GetTop(SqStack *s,int &e){
if(s->top==-1){
return false;
}
e=s->data[s->top];
return true;
}

链栈

链栈的四要素:
1、栈空条件:s->next=NULL。
2、栈满条件:不考虑。
3、进栈操作:将新的节点插在头节点之后。
4、退栈操作:取出头节点之后节点的元素并删除。

定义链栈的类型LiStack:

typedef struct linknode{
int data;  //数据域
struct linknode *next;  //指针域
}LiStack;

1、初始化栈

void(LiStack *&s){
s=(LiStack *)malloc(sizeof(LiStack));
s->next=NULL;
}

2、销毁栈

void DestroyStack(LiStack *&s){
LiStack *p=s,*q=s->next;
while(q!=NULL){
free(p);
p=q;
q=p->next;
}
free(p);  //此时只有最后一个尾节点没有释放
}

3、判断栈是否为空

bool StackEmpty(LiStack *s){
return (s->next==NULL);
}

4、进栈

void Push(LiStack *&s,int e){
LiStack *p;
p=(LiStack *)malloc(sizeof(LiStack));
p->data=e;
p->next=s->next;
s->next=p;
}

5、出栈

bool Pop(LiStack *&s,int &e){
LiStack *p;
if(s->next==NULL){
return false;
}
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return true;
}

6、取栈顶元素

bool GetTop(LiStack *s,int &e){
if(s->next==NULL){
return false;
}
e=s->next->data;
return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值