数据结构与算法整理复习(二)栈

一、栈

LIFO(后进先出)

插入和删除只能在栈顶进行

操作:

InitStack(&S);//初始化一个空栈
StackEmpty(S);//判断栈是否为空
Push(&S, x);//入栈,若栈不满,则入栈
Pop(&S, &x);//出栈,若栈不空,出栈并返回x
GetTop(S. &x);//返回栈顶元素

1.1 顺序栈

栈的定义与初始化与判空

//定义
#define MAX_SIZE 100
typedef struct SqStack{
    ElemType data[MAX_SIZE];
    int top;
}SqStack;

//初始化
InitStack(SqStack &S){
    S.top=-1;
}

//判空
bool StackEmpty(SqStack S){
    return S.top == -1;
}

栈的相关操作

//入栈,增
bool Push(SqStack &S, ElemType e){
    if(S.top >= MAX_SIZE-1) return false;
    S.top++;
    S.data[S.top] = e;
    /*
    * 假设栈的top直接从0开始,改为:
    * S.data[S.top] = e;
    * S.top++;
    */
    return true;
}

//出栈,减
bool Pop(SqStack &S, ElemType &e){
    if(S.top<0) return false;
    e = S.data[S.top];
    S.top--;
    /*
    * 假设栈的top直接从0开始,改为:
    * S.top--;
    * e = S.data[S.top];
    */
    return true;
}

//返回栈顶元素
bool GetTop(SqStack S, ElemType & e){
    if(S.top<0) return false;
    e = S.data[S.top];
    /*
    * 假设栈的top直接从0开始,改为:
    * e = S.data[S.top-1];
    */
    return true;
}

++i:先i自增再使用

i++:先使用i最后再加加

1.2 共享栈 

1.3 链栈

 定义与初始化

//定义
typedef struct LinkNode{
    ElemType data;
    struct LinkNode* next;
}*LinkStack,LinkNode;

//有头结点的初始化
void InitStack(LinkStack &S){
    S = (LinkNode*)malloc(sizeof(LinkNode));
    S.next = NULL;
}
//无头结点的初始化
void InitStack(LinkStack &S){
    S = NULL;
}


各种操作

//带头节点的push
bool Push(LinkStack &S, Elemtype e){
    LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
    p->data = e;
    p->next = S->next;
    S->next = p;
}

//不带头节点的push
bool Push(LinkStack &S, Elemtype e){
    LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
    p->data = e;
    p->next = S;
    S = p;
}

//带头节点的pop
bool Pop(LinkStack &S, Elemtype &e){
    if (S->next == NULL) return false;
    LinkNode* top = S->next;
    e = top->data;
    S->next = top->next
    free(top);
}

//不带头节点的push
bool Push(LinkStack &S, Elemtype e){
    if (S == NULL) return false;
    LinkNode* top = S;
    e = top->data;
    S = S->next
    free(top);
}


二、相关注意事项

数据结构

共享栈的好处为:节省存储空间的同时,降低上溢的可能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千天夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值