本文以栈、队列、链表、以及STL库中一些的数据结构作为主要讲解对象。
PS:需要按顺序看下来。
一、什么是数据结构
数据结构是一种在程序中系统化管理数据集合的形式。(自我理解就是便于我们实现某些特殊功能或方便操作数据而进行存储的一种结构)
根据自我理解,我觉得要在三个方面来进行自我学习,第一个方面,是如何存储,第二个方面,这个结构的规则(我认为可以理解为为了实现特殊功能而作出的约束,同时在特殊功能上会有更优解),第三个方面,就是如何去操作这个数据结构,例如在栈中,push(x)就是在栈顶部添加x这个元素。接下来本文的构造就是先给出一种数据结构能实现的特殊功能,然后在这三个方面逐一讲解。
1.栈
例题:逆波兰表示法:一种将运算符写在操作数后面的描述方法。不包含(/和%)
例如:1 2 + 3 4 - *表示的就是(1+2)*(3-4),答案就是-3。
看我们的标题,是用栈来解的,解释如下:首先我们读取的数字都是纯数字,然后读取到运算符我们就取出数字进行运算,这和栈的存储和规则十分耦合,栈的存储:通过数组来把数据填入进去(只能横向去填入),栈的规则:先进后出(意思是我去拿出数据的时候只能拿走我最后存储的那个数据,而不能拿走其他的数据),对应本题目,我们每次取出都是的纯数字,很符合这个特点,但有一点需要注意,就是减号的时候我们的运算顺序是相反(这个可以理解,毕竟数据结构可以是死的,但人可以是活的)。
栈的基本操作
push(x);//在栈顶部添加元素x
pop();//在栈顶部取出顶部元素
isEmpty();//检查栈是否为空
isFull();//检查栈是否已满
除上面那四个基本的操作之外,我们还需要一个指针来指向栈顶的元素(这是因为栈顶的元素取出的时候我们是不能知道这个元素的值的),所以需要一个指针一直指向栈顶的元素,当push(x)的时候,指针t++,当pop(),t--,这样就简单实现了指针的功能。掌握了这些内容我们就可以解上面那道例题了,但这里先不用C++STL的内容,咱们先用伪代码(模仿栈的构造)来实现它。
#include<bits/stdc++.h>
using namespace std;
int top,S[1000];//S数组为栈,下面的s为帮助输入的工具
void push(int x)
{
S[++top]=x;
}
int pop()
{
top--;
return s[top+1];
}
int main()
{
int a,b;
top=0;//用int型的top与数组合用,这里就不用指针了
char s[100];
while(scanf("%s",s)!=EOF)
{
if(s[0]=='+')
{a==pop();b=pop();push(a+b);}
else if(s[0]=='-')
{
b=pop();//这里注意是b先出来的然后a再出来,已经实现了颠倒顺序
a=pop();
push(a-b);
}
else if(s[0]=='*')
{
a=pop();
b=pop();
push(a*b);
}
else{push(atoi(s);)}//atoi函数是c语言中的函数,用来把整个字符串例如1234转化为整数1234
}
printf("%d\n",pop());
return 0;
}
`