数据结构、算法及线性表总结

数据结构、算法及线性表总结:

一. 思维导图

二. 重要概念笔记

1.数据结构相关术语:

数据元素:组成数据、有一定意义的基本单位,在计算机中被当做整体来处理。
数据项:数据结构中不可分割的最小单位。
数据对象:性质相同的数据元素的集合,是数据的子集,性质相同,也就是说数据元素的数据项相同(具有相同的数量和类型的数据项)。
数据结构:相互之间存在的一种或多种特定关系的数据元素的集合。

2.物理结构

物理结构是指数据的逻辑结构在计算机中的存储形式,物理结构有以下两种:
顺序存储结构:把数据元素存放在地址连续的存储单元中,数据间的逻辑关系和物理关系是一致的。
链式存储结构:在计算机中把数据元素存放在任意的存储单元中,可以是连续的,也可以是不连续的,用指针将每个数据元素联系起来。

3.算法:

特性:有穷性、确定性、可行性、输入、输出。
评判算法优劣:
时间复杂度( T(n)=O( f(n) ) ,n为问题规模)与
空间复杂度(占用的额外储存空间随问题规模的变化)

4.常见的时间复杂度耗时排列:

O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(!n)<O(nn)
(时间复杂度通常是指最坏情况的耗时时间)

5.线性表:

零个或多个数据元素的有限序列
线性表的两种存储结构:顺序存储&链式存储。
操作方法:头插法,尾插法。

6.栈:

是限定仅在表尾进行插入和删除操作的线性表,先进后出。
队列:是只允许在一端插入数据在另一端删除数据的线性表,先进先出。

7.串:

零个或多个字符组成的有限序列,又叫字符串。
模式匹配算法:BF算法、KMP算法。

8.地址计算:

若求矩阵A[M][N]中i行j列元素的地址,则
行优先:首地址+(iM+j)k
列优先:首地址+(iN+j)k
(K为单个元素所占的储存空间)

三. 疑难问题及解决方案

pta题目:求前缀表达式的值。

思路:

仔细审题,发现题目并没有说输入数据一定是正整数,所以负数和小数的情况也要考虑到。
由于是前缀表达式,所以必然是先有运算符,再有两个数字的,因此我们从后往前遍历。
对于上面说的小数与负数的特殊情况,当输入小数时,“.”前后是没有空格的,我们读取从右至左,所以会先读到“.”前的部分,然后是“.”,最后是“.”后的部分,因此只需要让“.”后的每一位除以十再加上前一位,如此这样直到遇到小数点为止,再将算出来的数加上小数点前的部分就行了。
当遇到负数时,因为“-”和数字中间一定没有空格,有空格一定是减号,所以遍历时如果遇到数字和“-”挨着,那么就一定是负数。
排除特殊情况后,每读取出一个数就压入栈中,当读到运算符时,就将栈顶的两个元素取出st.top()并删除这两个元素st.pop(),然后计算值并将值压入栈中以便下次计算st.push(sum)。

完整代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <stack>
#include <string>
#include <cctype>
using namespace std;
stack <double> st;
int main()
{
    string s;
    getline(cin, s);
    for (int i = s.size() - 1; i >= 0; i--)
    {
        if (isdigit(s[i]))
        {
            double mul = 10, num = s[i] - '0';
            for (i--; i >= 0; i--)
            {
                if (isdigit(s[i]))							//检验参数是否为数字字符 
                {
                    num += (s[i] - '0') * mul;						//将数字字符转化为数字 
                    mul *= 10;
                }
                else if (s[i] == '.')							//逐位处理小数点后的数据 
                {
                    num /= mul;
                    mul = 1;
                }
                else if (s[i] == '-')							//处理负数 
                    num = -num;
                else
                    break;
            }
            st.push(num);
        }
        else if (s[i] != ' ')
        {
            double a, b, sum;
            a = st.top();								//提出栈内数据 
            st.pop();
            b = st.top();
            st.pop();
            switch (s[i])
            {
            case '+':
                sum = a + b;
                break;
            case '-':
                sum = a - b;
                break;
            case '*':
                sum = a * b;
                break;
            case '/':
                {
                    if (b == 0)
                    {
                        cout << "ERROR";
                        return 0;
                    }
                    sum = a / b;
                }
            }
            st.push(sum);								//计算一次结果并压入栈中 
        }
    }
    printf("%.1lf", st.top());
}

posted on 2020-03-28 16:01  漆靖  阅读(210)  评论(0编辑  收藏  举报

导航