前言
昨天的队列如果理解了,今天的栈就非常好理解了。但今天学习栈的时候也发现了好多问题,比如思维定势呀,++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++是先赋值再运算+1;
2、++i是先运算+1再赋值;
如果这样还不好理解的话,一旦你遇到++i和i++分不清的时候,就在前面加个=
=i++ i离等号近 是先赋值再运算+1
=++i i离等号远 是先运算+1再赋值
这么一看,是不是就特别好理解了?