前言

昨天的队列如果理解了,今天的栈就非常好理解了。但今天学习栈的时候也发现了好多问题,比如思维定势呀,++i和i++的一些问题,在这里我也想和大家分享一下,我相信每个程序人都和我一样,遇到类似,甚至相同的问题。

我始终认为学习中的学是认识、了解的意思,习是练和改错的过程,合为一起才是真正的学习。犯错不可怕,犯很多次错也不可怕,相反,你只要改正了,那你收获的就不仅仅是犯错的本身了。


一、什么是栈?

栈(stack)又名堆栈,它是一种运算受限的线性表。
线性...
线性表是什么?对吧

在这里插入图片描述

去看我昨天的队列那篇文章

说的这么简单是不是也不太懂。那你就想一想羽毛球盒,你一个球一个球的往里放,放满过后在去拿。你拿到的第一个球是不是最后放进去的?

不是?那你羽毛球被偷了,赶紧回去找找。

二、栈里面要知道的概念

1.栈顶/栈底

在这里插入图片描述

栈顶就是栈这张线性表的表尾。
为什么是表尾?这就要考虑到我们操作的地方了,我们进行的插入和删除操作都是从表尾进行的。所以,表尾这一端被称为栈顶,另一端为栈底。

2.进栈、入栈、压栈

哎呀呀,皮皮安,你怎么一下整这么多出来了,记不了呀

别慌嘛,这三个都是同一个意思,这里之所以都列出连,是因为以后见到了就不陌生了。别到时候记住了压栈,别人问入栈就不知道了,好了好了,不bb了

向一个栈插入新元素又称作进栈、入栈或压栈

3.出栈、退栈

入栈对应这插入操作,那么退栈就对应这删除操作。
从一个栈删除元素又称作出栈或退栈

上例题

大家在学完C语言的时候想必都被斐波那契数列,杨辉三角,回文数这些东西折磨过吧。

今天,我带大家从栈的层面,彻底认识回文。

回文:称正读和反读都相同的字符序列为“回文”,如“abba”、“abccba”、12321、123321是“回文”,“abcde”和“ababab”则不是“回文”。(来自百度百科)

如果一个字符串回文的话,那么必然是中间对称的。
//为什么要减一,而不是加一,稍后为大家解答
mid = len/2-1
然后将字符串入栈
//为什么是++top,而不是top++,也稍后说
for(int i = 0;i <= mid;i++)
{
	s[++top] = a[i];
}
最主要的一部来了,开始出栈,判断是否与mid以后的字符串相匹配
if(len%2 == 0)
        next = mid + 1;
    else
        next = mid + 2;


    for(int i = next;i < len;i++)
    {
        if(a[i] != s[top])
            break;
        top--;
    }

Java/C代码

C语言代码

#include <stdio.h>
#include <string.h>

int main()
{
    char a[101],s[101];
    int top,len,mid,next;

    printf("请输入字符串");
    gets(a);
    len = strlen(a);
    mid = len/2 - 1;

    //初始化栈
    top = 0;

  
    //入栈
    for(int i = 0;i <= mid;i++)
    {
        top++;
        s[top] = a[i];
    }

    //判断字符串是奇数还是偶数
    if(len%2 == 0)
        next = mid + 1;
    else
        next = mid + 2;


    for(int i = next;i < len;i++)
    {
        if(a[i] != s[top])
            break;
        top--;
    }

    //判断是否为回文数
    if(top == 0)
        printf("是回文数");
    else
        printf("不是回文数:%d",top);


}

Java代码

package stack;

import java.util.Scanner;

public class stack {
    public static void main(String[] args) {
        char[] a = new char[101];
        char[] s = new char[101];

        int mid,next,top;

        String x;

        Scanner scanner = new Scanner(System.in);

        x = scanner.next();

        for (int i = 0; i < x.length(); i++) {
            a[i] = x.charAt(i);
        }

        mid = x.length()/2-1;
        //初始化栈
        top = 0;
        for (int i = 0; i <= mid; i++) {
            s[++top] = a[i];
        }

        //判断字符串是奇数还是偶数
        if (x.length()%2 == 0)
            next = mid + 1;
        else
            next = mid + 2;

        //出栈
        for (int i = next; i < x.length(); i++) {
            if (s[top] != a[i]){
                break;
            }
            top--;
        }
        //判断是不是回文
        if (top == 0)
            System.out.println("是回文");
        else
            System.out.println("不是回文");

    }
}

遇到的问题

问题1:++i和i++

我相信这个问题肯定困扰大家好久了吧。学了编程一年多了,到头来还要重新翻书重新学一遍。
1、i++是先赋值再运算+12++i是先运算+1再赋值;

如果这样还不好理解的话,一旦你遇到++i和i++分不清的时候,就在前面加个=

=i++ i离等号近 是先赋值再运算+1
=++i i离等号远 是先运算+1再赋值
这么一看,是不是就特别好理解了?

问题2:思维定势

在日常生活中,我们一切是不是都从1开始,答应我,现在一切从0开始。
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值