数据结构(data structure)
1. 简介
数据结构是在计算机中组织与存储数据的方式
如果想要表示“一排数字”,自然想到使用「数组」数据结构
数组的存储方式可以表示数字的相邻关系、顺序关系,但至于其中存储的是整数int,还是小数float, 或是字符char,则与所谓的数据的结构无关了
换言之,基本数据类型提供了数据的“内容类型”,而数据结构提供数据的“组织方式”
2.分类
数据结构主要可根据「逻辑结构」和「物理结构」两种角度进行分类
3.逻辑结构
「逻辑结构」反映了数据之间的逻辑关系。
//这里的逻辑关系指数据间的前后间关系,与数据在计算机中的存储位置无关。
一般将逻辑结构分为「线性」和「非线性」两种:
①线性数据结构:数组、队列、栈、链表、哈希表;
②非线性数据结构:(多维数组)、堆、树结构、图结构、哈希表;
4.物理结构
「物理结构(或存储结构)」反映了数据在计算机内存中的存储方式
从本质上看,分别是数组的连续空间存储和链表的离散空间存储
常用的物理结构(或存储结构)有:
①顺序结构(连续结构):在内存中用一组地址连续的存储单元依次存储线性表的各个数据元素。
②链式结构:在内存中的存储元素不一定是连续的,用任意地址的存储单元存储元素,元素节点存放数据元素以及通过指针指向相邻元素的地址信息。
③索引结构:除建立存储结点信息外,还需建立一张索引表(作用:标识节点的地址)。
//索引表由若干索引项组成。
④Hash结构(又称杂凑结构或散列结构):由节点的关键码值决定节点的存储地址。
所有数据结构都是基于数组、或链表、或两者组合实现的
例如栈和队列,既可以使用数组实现、也可以使用链表实现
而例如哈希表,其实现同时包含了数组和链表
●基于数组可实现:栈、队列、哈希表、树、堆、图、矩阵、张量(维度≥3的数组)等;
●基于链表可实现:栈、队列、哈希表、树、堆、图等;
基于数组实现的数据结构也被称为「静态数据结构」,这意味着该数据结构在在被初始化后,长度不可变
相反地,基于链表实现的数据结构被称为「动态数据结构」,该数据结构在被初始化后,我们也可以在程序运行中修改其长度
5.常见的几个数据结构
①数组(Array)
②队列(Queue)
----FIFO 即先进先出,相当于排队
③栈(Stack)
----FILO 即先进后出、后进先出,相当于坐电梯
例题1--说明栈的应用:hdu 1062“Text Reverse”(C++)
题目链接:Problem - 1062
Text Reverse
Problem Description
Ignatius likes to write words in reverse way. Given a single line of text which is written by Ignatius, you should reverse all the words and then output them.
Input
The input contains several test cases. The first line of the input is a single integer T which is the number of test cases. T test cases follow.
Each test case contains a single line with several words. There will be at most 1000 characters in a line.
Output
For each test case, you should output the text which is processed.
Sample Input
3 olleh !dlrow m'I morf .udh I ekil .mca
Sample Output
hello world! I'm from hdu. I like acm.
Hint
Remember to use getchar() to read '\n' after the interger T, then you may use gets() to read a line and process it.
Author
Ignatius.L
题意:翻转字符串。
/*hdu 1062“Text Reverse” C++*/
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
char ch;
scanf("%d",&n);
getchar();
while(n--){
stack<char> s;
while(true){
ch=getchar();//一次读入一个字符
if(ch==' '||ch=='\n'||ch==EOF){//如果这个单词或语句已结束
while(!s.empty()){//判断栈顶不为空 ,输出这个反文
printf("%c",s.top());//输出栈顶
s.pop();//清除栈顶
}
if(ch=='\n'||ch==EOF) break;//如果换行或结束就输出换行(跳出执行26行)
printf(" ");//不是就输出空格隔开单词
}
else s.push(ch);//若没结束,入栈
}
printf("\n");
}
return 0;
}
④链表(Linked List)
⑤树(Tree)
⑥哈希表(Hash)
⑦堆(Heap)
⑧图(Graph)