数据结构 一文教你掌握栈 (记得做题噢~)

1,什么是栈?

栈好比一个羽毛球袋,只有一个口让你拿球和塞球。也就是俗话说的后入先出(LIFO)

对栈的操作只有两个push  和 pop

2,showshow code

如何实现一个栈

下面用两种方法实现,大家可以自行对比

①判断是否为NULL

bool isEmpty(Stack Stk){
    return s->next == NULL;
}

②创建一个空栈

Stack CreateStack(void){
    Stack stk;
    S = malloc(sizeof(Stack));
    if(S == NULL){
        return NULL;
    }
    while(!isEmpty(S)){
        Pop(S);
    }
}
struct Stack{
    int top;
    int maxtop;
    int* nums;
}

Stack CreateStack(int max){
    Stack stk = malloc(sizeof(struct Stack));
    stk->nums = malloc(sizeof(max));
    stk->maxtop = max;
    stk->top = 0;
}

③入栈

void Push(Stack stk, int val){
    Node temp = malloc(sizeof(Node));
    temp->val = val;
    temp->next = stk->next;
    stk->next = temp;
}

void push(Stack stk, int val){
    stk->nums[stk->top++] = val;
}

④返回栈顶元素

int Top(Stack stk){
    if(!stk->next){
        return 0;
    }
    return stk->next->val;
}
int Top(Stack stk){
    return stk->nums[stk->top-1];
}

⑤出栈

void Pop(Stack stk){
    Node temp;
    temp = stk->next;
    stk->next = temp->next;
    free(temp);
}
void Pop(Stack stk){
    stk->top--;
}

3,栈的简单应用

①平衡符号:编译器检验语法错误

思路:创建一个空栈,读入字符。 如果字符是一个开放符号---({[,则入栈;

如果字符是一个封闭符合,则弹出栈中元素,不一致或者栈空则报错。

读入字符结束,栈中还有元素则报错。

②后缀表达式(逆波兰数)

思路:描述加减乘除四则运算

举个例子:

逆波兰数:6 5 2 3 + 8 * + 3 + *

第一步:栈中元素 3 2 5 6

第二步:读'+', 则弹出3,2    并将5入栈 栈中元素变为 5 5 6;同时8 进栈  8 5 5 6

第三步:读'*',则弹出8 5,并将40入栈 栈:40 5 6

第四步:读'+',则弹出40 5 ,并将45入栈  栈:45 6;同时3入栈  3 45 6

第五,六步:依次读'+'  '*',最后得到结果 288

③如何将算式转化为逆波兰数呢?

a + b * c + (d * e + f) * g

首先搞清楚算数优先级:'*' == '/' > '+' == '-'

思路:操作数输出,操作符入栈,并弹出优先级 >= 本身的操作符

’(‘优先级最高,遇到')'将中间所有操作符弹出

举个例子:

a b c * + d e * f + g * +

到此为止,你已经明白栈是什么东西了,现在开始做题吧~

1,有效的括号

2,二叉树展开为链表

 3,每日温度

4,最短无序连续子数组

5,最小栈

6,柱状图中最大矩形

7,接雨水

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值