ImageVerifierCode 换一换
格式:DOCX , 页数:215 ,大小:1.23MB ,
资源ID:28054681      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28054681.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(大数据结构与算法源代码.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

大数据结构与算法源代码.docx

1、大数据结构与算法源代码课程说明:数据结构一共四天课程,day01day04.CSD DataStructure DAY011. 基于顺序表的堆栈2. 基于链式表的堆栈1 基于顺序表的堆栈栈是一种特殊的线性表,是限定在线性表表尾进行插入删除操作的线性表。由栈的概念衍生出几个子概念,它们是:1)栈顶,即允许进行插入、删除操作的一端,又称为表尾,用栈顶指针()来指示栈顶元素。2)栈底,即固定端,又称为表头3)空栈,即栈当中没有数据元素。顺序栈是采用顺序存储结构的栈,即使用一组连续的存储单元(一般使用数组)来模拟栈,依次存放栈中的数据元素。1.1 方案顺序栈的基本操作包括:1) 初始化操作,在初始化操

2、作中将建立一个空栈。2) 判断栈空,判断栈中的数据元素个数是否为0。3) 入栈,在栈中加入一个数据元素。4) 出栈,在栈中删除一个数据元素。5) 取栈顶元素,将栈顶元素取出,但并不在栈中删除该元素。1.2 步骤实现此案例需要按照如下步骤进行。步骤一:定义栈在C语言中:1)定义一个一维数组来表示栈的顺序存储空间。2)定义一个变量来指出栈顶的位置。3)这两方面的信息共同描述一个栈,可将它们用结构体封装在一起。代码如下:1. #define LISTSIZE 102. typedef int DataType;3. struct Stack 4. DataType dataLISTSIZE;5. i

3、nt ; /除了记录大小 还可以记录栈顶位置6. ;上述代码中,以下代码:1. #define LISTSIZE 100是用一个宏常量来定义顺序表的容量,这样定义的好处是当需要修改顺序表的容量的时候,只需要修改该宏常量即可。上述代码中,以下代码:1. typedef int DataType;是将数据类型int起了一个别名叫做DataType,并在后面的程序中只使用DataType,而不使用int。这样做的好处是当堆栈中的数据类型发生变化时,只需要修改此句中的int为要改变的数据类型,即可将程序中所有数据变量的数据类型变成指定的类型。步骤二:初始化操作在主程序中,定义栈结构体的变量。在初始化函

4、数中将该变量中的栈顶指针初始化为0,表示为空栈。代码如下:1. void init(struct Stack *stack)2. 3. stack- = 0;4. 5. int main(int argc, const char * argv)6. 7. struct Stack stack;8. init(&stack);9. 步骤三:判断栈空判断栈空实际上是判断栈顶指针是否为0,因为当栈顶指针为0时,代表栈中没有数据元素。代码如下:1. bool empty(struct Stack* stack) 2. return stack- = 0;3. 步骤四:入栈入栈是在栈中加入一个数据元素,

5、在入栈时,首先需要判断栈是否为满,如果栈满了,则就不能在向其中添加元素了,判断栈是否满的操作只有在顺序存储结构才会出现,因为采用顺序存储结构的栈是要事先定义栈的容量的。然后将数据元素放入栈中,并使栈顶指针加1,指向下一个位置。代码如下:1. void push(struct Stack* stack, DataType d) 2. if (stack- = LISTSIZE)3. return;4. stack-datastack-+ = d;5. 上述代码中,以下代码:1. if (stack- = LISTSIZE)是判断栈是否满,判断栈顶指针是否与栈的容量相等,如果是,则表示栈已经满了。

6、步骤五:出栈出栈操作实际上是将栈中的栈顶元素删除,在出栈时,首先判断栈是否为空,如果栈为空则代表栈中已经没有数据元素了,此时是不可能进行出栈操作的。然后,将栈顶指针减1。代码如下:1. void pop(struct Stack* stack) 2. if (empty(stack)3. return;4. stack-;5. 步骤六:取栈顶元素取栈顶元素操作实际上是仅返回栈顶元素,而栈顶指针并不变动。在取栈顶元素时,首先也要判断栈是否为空,因为空栈同样是不可能有数据元素的。代码如下:1. DataType Data(struct Stack* stack) 2. return stack-d

7、atastack- - 1;3. 1.3 完整代码本案例的完整代码如下所示:1. #include 2. #include 3. 4. #define LISTSIZE 105. typedef int DataType;6. struct Stack 7. DataType dataLISTSIZE;8. int ; /处了记录大小 还可以记录栈顶位置9. ;10. 11. void init(struct Stack* stack)12. 13. stack- = 0;14. 15. 16. bool empty(struct Stack* stack) 17. return stack-

8、 = 0;18. 19. 20. void push(struct Stack* stack, DataType d) 21. if (stack- = LISTSIZE)22. return;23. stack-datastack-+ = d;24. 25. 26. void pop(struct Stack* stack) 27. if (empty(stack)28. return;29. stack-;30. 31. 32. DataType Data(struct Stack* stack) 33. return stack-datastack- - 1;34. 35. 36. 37

9、. int main()38. 39. struct Stack stack;40. init(&stack);41. push(&stack, 30);42. push(&stack, 60);43. push(&stack, 80);44. 45. while (!empty(&stack) 46. printf(%d , Data(&stack);47. pop(&stack);48. 49. printf(n);50. 51. return 0;52. 2 基于链式表的堆栈2.1 问题链栈是采用链式存储结构的栈,即使用一组不要求连续的存储空间来模拟栈。每个栈元素为一个节点, 每个节点中

10、包含两个域,一个是数据域,用于存储栈元素的数据;另一个是指针域,用于存储下一个栈元素的地址。2.2 方案链栈的基本操作包括:1) 初始化操作,在初始化操作中将栈顶指针置空。2) 判断栈空,判断栈顶指针是否为空。3) 入栈,在栈中加入一个数据元素。4) 出栈,在栈中删除一个数据元素。5) 取栈顶元素,将栈顶元素取出,但并不在栈中删除该元素。2.3 步骤实现此案例需要按照如下步骤进行。步骤一:定义栈元素节点在C语言中:1)定义一个变量来表示栈元素的数据。2)定义一个指针来指向下一个栈元素的位置。3)这两方面的信息共同描述一个栈元素节点,可将它们用结构体封装在一起。代码如下:1. typedef i

11、nt DataType;2. struct Stack 3. DataType data;4. struct Stack *next;5. ;上述代码中,以下代码:1. struct Stack *next;是定义了一个指向下一个栈元素的指针,由于下一个栈元素的数据类型与当前栈元素的数据类型相同,所以指针的数据类型就是栈节点的指针数据类型。步骤二:初始化操作在主程序中,定义栈顶指针。在初始化函数中将栈顶指针初始化为NULL,表示为空栈。代码如下:1. void init(struct Stack* )2. 3. * = NULL;4. 5. int main()6. 7. struct Sta

12、ck *;8. init(&);9. return 0;10. 上述代码中,以下代码:1. void init(struct Stack* )定义了初始化函数的函数头,该函数有一个形参,是栈元素结构体指针的指针。之所以使用指针的指针,是因为栈顶指针在函数执行过程中会被置空,而这种变化需要带回主函数。步骤三:判断栈空判断栈空操作实际上就是判断栈顶指针是否为空。代码如下所示:1. bool empty(struct Stack* )2. 3. return = NULL;4. 步骤四:入栈入栈操作实际上就是在栈中加入一个数据元素,对于链栈,入栈操作本质上就是在栈中加入一个结点。代码如下所示:1.

13、void push(struct Stack* , DataType d)2. 3. struct Stack *newNode = (struct Stack*)malloc(sizeof(struct Stack);4. newNode-data = d;5. newNode-next = *;6. * = newNode;7. 上述代码中,以下代码:1. void push(struct Stack* , DataType d)定义了入栈函数的函数头,该函数有两个形参,第一个是栈结构的指针的指针,在这里使用指针的指针,还是因为需要将栈顶指针的变化带回主函数。第二个形参是需要入栈的数据。上

14、述代码中,以下代码:1. struct Stack *newNode = (struct Stack*)malloc(sizeof(struct Stack);是构造一个新的栈元素节点。上述代码中,以下代码:1. newNode-data = d;是将需要入栈的元素放入新的栈元素节点中。上述代码中,以下代码:1. newNode-next = *;是将新创建的栈元素节点加入到栈中原栈顶元素的前面,成为新的栈顶元素。上述代码中,以下代码:1. * = newNode;是栈顶指针指向新创建的栈顶元素。正是由于这行代码,使栈顶指针发生了变化,而这种变化需要带回到主程序,所以函数的第一个形参必须是指针

15、的指针。步骤五:出栈出栈操作实际上就是从栈中删除栈顶位置的元素,对于链栈,出栈操作本质上就是在栈中删除一个结点。代码如下所示:1. void pop(struct Stack* )2. 3. if (empty(*)4. return;5. struct Stack *tempNode = *;6. * = (*)-next;7. free(tempNode);8. 上述代码中,以下代码:1. if (empty(*)2. return;是判断链栈是否为空,如果栈为空是不能从栈中删除元素的。上述代码中,以下代码:1. struct Stack *tempNode = *;2. * = (*)-

16、next;3. free(tempNode);首先用一个临时指针保存原栈顶指针指向的栈元素地址,即出栈元素的地址,然后将栈顶指针指向下一个元素,这样栈中就减少了一个元素。最后释放临时指针指向的元素,即释放出栈元素所占的存储空间。步骤六:取栈顶元素取栈顶元素实际上就是将栈顶元素的值返回,对于链栈,本质上是将栈顶节点的数据返回。注意,在取栈顶元素时,首先要判断栈是否为空,空栈是没有数据元素的。代码如下:1. void Data(struct Stack* , DataType* data)2. 3. if (empty()4. return;5. *data = -data;6. 2.4 完整代码

17、本案例的完整代码如下所示:1. #include 2. #include 3. #include 4. 5. typedef int DataType;6. struct Stack 7. DataType data;8. struct Stack *next;9. ;10. 11. void init(struct Stack* )12. 13. * = NULL;14. 15. 16. bool empty(struct Stack* )17. 18. return = NULL;19. 20. 21. void push(struct Stack* , DataType d)22. 23

18、. struct Stack *newNode = (struct Stack*)malloc(sizeof(struct Stack);24. newNode-data = d;25. newNode-next = *;26. * = newNode;27. 28. 29. void pop(struct Stack* )30. 31. if (empty(*)32. return;33. struct Stack *tempNode = *;34. * = (*)-next;35. free(tempNode);36. 37. 38. void Data(struct Stack* , D

19、ataType* data)39. 40. if (empty()41. return;42. *data = -data;43. 44. 45. 46. int main()47. 48. struct Stack *;49. init(&);50. push(&, 30);51. push(&, 60);52. push(&, 80);53. 54. while (!empty() 55. int data;56. Data(, &data);57. printf(%d , data);58. pop(&);59. 60. printf(n);61. 62. return 0;63. 作业

20、:1 1. 逆波兰法求解四则运算表达式在计算机中,表达式的处理是很重要的一项工作。表达式被分成中缀表达式和后缀表达式两种形式。所谓中缀表达式就是我们日常书写表达式的方法,操作数在两边,运算符在中间,如1+2。这种表达式易于理解,但是很难被计算机解析。为了让计算机能够简单地解析表达式,可采用后缀表达式。后缀表达式又被称为逆波兰表示法,是将运算符至于操作数的后面,如中缀表达式1+2表示成后缀表达式为12+。后缀表达式中的一个特点是不需要使用括号,就可以准确地表示表达式的优先级,如中缀表达式1+2*3表示成后缀表达式后为123*-,而中缀表达式(1+2)*3表示成后缀表达式则为12+3*。本案例的工

21、作是先将中缀表达式转换成后缀表达式,然后计算后缀表达式。参考答案实现此案例需要按照如下步骤进行。步骤一:定义两个栈首先,定义一个字符数组,用于存放待转换的字符串。定义一个“结果栈”,用于存放转换过程中的每一步结果。定义一个“运算符栈”,用于存放转换过程中的运算符。代码如下所示:1. #include 2. #include 3. 4. #define LISTSIZE 105. typedef int DataType;6. 7. struct Stack 8. DataType dataLISTSIZE;9. int ; /处了记录大小 还可以记录栈顶位置10. ;11. 12. void

22、init(struct Stack* stack)13. 14. stack- = 0;15. 16. 17. void push(struct Stack* stack, DataType d) 18. stack-datastack-+ = d;19. 20. 21. void pop(struct Stack* stack) 22. stack-;23. 24. 25. DataType (struct Stack* stack) 26. return stack-datastack- - 1;27. 28. 29. bool empty(struct Stack* stack) 30.

23、 return stack- = 0;31. 32. 33. bool prior(char op1, char op2) 34. return (op1 = * | op1 = /) & (op2 = + | op2 = -);35. 36. 37. int main() 38. char expr = 1+2*3/(4-1);39. struct Stack res;/结果栈40. struct Stack oper;/运算符栈41. init(&res);42. init(&oper);43. 步骤二:逐个读取字符串中的字符,直到结束设置一个循环,逐个从字符数组expr中读取字符,直到遇

24、见字符0。代码如下所示:1. #include 2. #include 3. 4. #define LISTSIZE 105. typedef int DataType;6. 7. struct Stack 8. DataType dataLISTSIZE;9. int ; /处了记录大小 还可以记录栈顶位置10. ;11. 12. void init(struct Stack* stack)13. 14. stack- = 0;15. 16. 17. void push(struct Stack* stack, DataType d) 18. stack-datastack-+ = d;19

25、. 20. 21. void pop(struct Stack* stack) 22. stack-;23. 24. 25. DataType (struct Stack* stack) 26. return stack-datastack- - 1;27. 28. 29. bool empty(struct Stack* stack) 30. return stack- = 0;31. 32. 33. bool prior(char op1, char op2) 34. return (op1 = * | op1 = /) & (op2 = + | op2 = -);35. 36. 37.

26、int main() 38. char expr = 1+2*3/(4-1);39. struct Stack res;/结果栈40. struct Stack oper;/运算符栈41. init(&res);42. init(&oper);43. 44. for (int i = 0; expri != 0; i+) 45. char ch = expri;46. 47. 步骤三:将数字放入“结果栈”中判断读出的字符是否是数字,如果是数字,则将该数字放入“结果栈”中。代码如下所示:1. #include 2. #include 3. 4. #define LISTSIZE 105. typ

27、edef int DataType;6. 7. struct Stack 8. DataType dataLISTSIZE;9. int ; /处了记录大小 还可以记录栈顶位置10. ;11. 12. void init(struct Stack* stack)13. 14. stack- = 0;15. 16. 17. void push(struct Stack* stack, DataType d) 18. stack-datastack-+ = d;19. 20. 21. void pop(struct Stack* stack) 22. stack-;23. 24. 25. Data

28、Type (struct Stack* stack) 26. return stack-datastack- - 1;27. 28. 29. bool empty(struct Stack* stack) 30. return stack- = 0;31. 32. 33. bool prior(char op1, char op2) 34. return (op1 = * | op1 = /) & (op2 = + | op2 = -);35. 36. 37. int main() 38. char expr = 1+2*3/(4-1);39. struct Stack res;/结果栈40. struct Stack oper;/运算符栈41. init(&res);42. init(&oper);43. 44. for (int i = 0; expri != 0; i+) 45.

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1