当前位置:   article > 正文

TYUT数据结构课设_输入的每一行都包含一条指令。每行都以一个字母(或者是“i”或者是 “d”)开头,后

输入的每一行都包含一条指令。每行都以一个字母(或者是“i”或者是 “d”)开头,后

- 以学习为目的,仅供参考

1. 字符串和堆栈

【问题描述】

编写一个程序,检查符串是否包含正确嵌套和平衡的圆括号、 方括号和花括号。

【基本要求】

程序时,输入一个包含圆括号、方括号和花括号的字符串,分析其中的圆括号、 方括和花括号是否正确嵌套和平衡。如果字符串是平衡的, 程序将不输出任何内容, 并以EXIT_SUCCESS状态退出。其他情况,将输出一条错误消息,并以失败状态退出。

扫描字符串遇到(、[或{时, 将该该括号入栈; 遇到)、]或}时, 将从栈中弹出顶 部括号,并检查它是否与字符串中遇到的右括号匹配;如果括号不匹配,或者栈为空, 程序将输出不匹配的括号和遇到的不匹配的括号的索引;如果扫描字符串结束时,为空 输出信息: open:对应右括号列表。如表1-1所示。

输入

输出

)

0:)

([)]

2:)

([{

open:}])

代码 

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define MAXN 2000
  4. char s[MAXN];
  5. char stk[MAXN];
  6. int top = 0;
  7. int main()
  8. {
  9. scanf("%s",s);
  10. for(int i = 0; i < strlen(s); i++){
  11. if(s[i] == '('){ stk[top++] = '('; }
  12. if(s[i] == '['){ stk[top++] = '['; }
  13. if(s[i] == '{'){ stk[top++] = '{'; }
  14. if(s[i] == ')'){
  15. if (top-1 >= 0 && stk[top-1] == '(' ){ top--; continue; }
  16. else{
  17. cout <<i <<":" <<s[i];
  18. return EXIT_FAILURE;
  19. }
  20. }
  21. if(s[i] == ']'){
  22. if (top-1 >= 0 && stk[top-1] == '[' ){ top--; continue; }
  23. else{
  24. cout <<i <<":" <<s[i];
  25. return EXIT_FAILURE;
  26. }
  27. }
  28. if(s[i] == '}'){
  29. if (top-1 >= 0 && stk[top-1] == '{' ){ top--; continue; }
  30. else{
  31. cout <<i <<":" <<s[i];
  32. return EXIT_FAILURE;
  33. }
  34. }
  35. }
  36. if (top != 0){
  37. cout <<"open:";
  38. for(int i = top-1; i >= 0; i--){
  39. if (stk[i] == '(') cout <<')';
  40. if (stk[i] == '[') cout <<']';
  41. if (stk[i] == '{') cout <<'}';
  42. }
  43. return EXIT_FAILURE;
  44. }
  45. return EXIT_SUCCESS;
  46. }

2. 有序链表的维护

2.1 【问题描述】

编写个程序, 根据从标准输入接收的指令来维护和操作排序的链表。链表是按顺 序维护的,这意味着链表中的数据在每次操作后都以递增的数字顺序存储。

注意, 在创建新节点时, 需要使用malloc为它们分配空间; 一旦不再需要任何已

分配的空,就应该使用free将其释放。还要注意, 链表不包含重复的值。

2.2 【基本要求】

链表支持两种操作指令

插入n:向链表中添加一个整数n。如果链表中已经存在n,则它什么也不做。 指令 格式是一个i后跟一个空格和一个整数n

删除n:从链表中删除一个整数n。如果链表中不存在n,它什么也不做。 指令格式 是d后跟一个空格和一个整数n

每个命令之后, 程序将输出链表的长度,然后是链表的内容, 按照从第一个(最 小)到最后一个(最大)的顺序。

入格式:输入的每一行都包含一条指令。每行都以一个字母(或者是“i”或者是 d”)开头,后跟一个空格, 然后是一个整数。以“i”开头的一行表示该整数应该插 入链表中。以 “d开头的一行表示应从链表中删除该整数。输入i和d以外的字符程序 结束运行。

输出式:执行每个指令后, 程序将输出一行文本, 其中包含表的长度、一个冒 号以及按顺序排列的表元素,所有内容都用空格分隔。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef struct node{
  4. int data;
  5. struct node *nxt;
  6. }node;
  7. typedef node *linklist;
  8. int cnt;
  9. void init(linklist &l){
  10. l = (linklist)malloc(sizeof(linklist));
  11. if(!l){
  12. puts("initial fail");
  13. exit(0);
  14. }
  15. l->data = 0;
  16. l->nxt = NULL;
  17. }
  18. void insert(linklist &l,int data){
  19. linklist p,x;
  20. p = l;
  21. while(p->nxt != NULL){
  22. if(p->data <= data && p->nxt->data >= data)
  23. break;
  24. p = p->nxt;
  25. }
  26. x = (linklist)malloc(sizeof(linklist));
  27. x->data = data;
  28. x->nxt = p->nxt;
  29. p->nxt = x;
  30. cnt++;
  31. }
  32. void del(linklist &l,int data){
  33. linklist p, temp;
  34. int ans = 0;
  35. p = l;
  36. //寻找要删除的节点
  37. while(p->nxt != NULL){
  38. if(p->nxt->data == data){
  39. temp = p->nxt;
  40. ans = 1;
  41. break;
  42. }
  43. p = p->nxt;
  44. }
  45. //未找到
  46. if(p->nxt == NULL)
  47. return;
  48. //删除释放节点
  49. if (ans){
  50. p->nxt = p->nxt->nxt;
  51. free(temp);
  52. cnt--;
  53. }
  54. }
  55. int main(){
  56. linklist L;
  57. init(L);
  58. char op;
  59. int num;
  60. while(scanf("%c %d",&op, &num)!=EOF){
  61. getchar();
  62. if(op =='d') del(L,num);
  63. if(op =='i') insert(L,num);
  64. printf("%d:",cnt);
  65. linklist p = L;
  66. for(int i = 1; i <= cnt; i++){
  67. p = p->nxt;
  68. printf(" %d",p->data);
  69. }
  70. putchar('\n');
  71. }
  72. return 0;
  73. }
  74. /*
  75. i 5
  76. d 3
  77. i 3
  78. i 500
  79. d 5
  80. */

3. 二叉查找树操

3.1 【问题描述】

编写个操纵二叉查找树的程序。它将从标准输入接收命令, 并将这些命令的响应 印到标准输出。

二叉找树是一棵二叉树, 它在内部节点存储整数值。特定节点的值大于存储在其

左侧子树中的每个值,小于存储在其右侧子树中的每个值。该树不包含重复值。

注意, 在创建新节点时, 需要使用malloc为它们分配空间; 一旦不再需要任何已

分配的空间,就应该使用free将其释放。

3.2 【基本要求】

操纵二叉查找树的命令有4个:

插入n向树中添加一个值,如果还没有的话,新节点将始终作为现有节点的子节 点或根节点添加,现有节点不会因为插入数据而改变或移动。如果n不存在,因此将被 插入程序打印插入;否则,它将打印不插入。指令格式是一个i后跟一个十进制整数n

搜索n:在树中搜索值n。如果n存在, 程序将打印存在;否则会打印缺席。 指令格 式是一个s后跟一个空格和一个整数n

印:空树(即空)被打印为空字符串。节点被打印为一个(,后跟左边的子树、该 节点的项右边的子树和),没有空格。 指令格式是一个p。例如, 对应于图3-1的输出 是((1)2((3(4))5(6)))

除n:从树中删除一个值。 删除二叉树排序中的节点有几种策略。如果一个节点 没有子点, 可以简单地删除它;也就是说, 指向它的指针可以更改为空指针。如果一 个节点一个子节点, 它可以被那个子节点替换。如果一个节点有两个子节点, 其值将 被更改为其左子树中的最大元素,之前包含该值的节点将被删除。请注意, 正在删除 能在根节点上。 指令格式是一个d后跟一个空格和一个整数n

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef struct bnode{
  4. int data;
  5. struct bnode *lchild,*rchild;
  6. }bnode;
  7. typedef bnode *btree;
  8. //递归打印路径
  9. void printbst(btree t){
  10. if(t == NULL)
  11. return;
  12. printf("(");
  13. printbst(t->lchild);
  14. printf("%d",t->data);
  15. printbst(t->rchild);
  16. printf(")");
  17. }
  18. int insert(btree t,btree fa,int data){
  19. if(t == NULL){
  20. btree x = (btree)malloc(sizeof(btree));
  21. x->lchild = NULL;
  22. x->rchild = NULL;
  23. x->data = data;
  24. if(data > fa->data) fa->rchild = x;
  25. else fa->lchild = x;
  26. return 1;
  27. }
  28. if(t->data==data) return 0;
  29. if(t->data>data) return insert(t->lchild,t,data);
  30. if(t->data<data) return insert(t->rchild,t,data);
  31. }
  32. int search(btree t,int data){
  33. if(t == NULL) return 0;
  34. if(t->data == data) return 1;
  35. if(t->data > data) return search(t->lchild,data);
  36. if(t->data < data) return search(t->rchild,data);
  37. }
  38. void del(btree t,btree fa){
  39. //没有子节点
  40. if(t->lchild == NULL && t->rchild == NULL){
  41. free(t);
  42. if(fa->data > t->data) fa->lchild = NULL;
  43. else fa->rchild = NULL;
  44. }
  45. //子节点只有一个
  46. else if(t->lchild == NULL){
  47. if(fa->data > t->data){
  48. fa->lchild = t->rchild;
  49. free(t);
  50. }
  51. else{
  52. fa->rchild = t->rchild;
  53. free(t);
  54. }
  55. }
  56. else if(t->rchild == NULL){
  57. if(fa->data > t->data){
  58. fa->lchild = t->lchild;
  59. free(t);
  60. }
  61. else{
  62. fa->rchild = t->lchild;
  63. free(t);
  64. }
  65. }
  66. //子节点都在,将子树中最大的元素变为根节点
  67. else{
  68. btree p = t;
  69. while(p->rchild != NULL) p = p->rchild;
  70. p->rchild = t->rchild;
  71. p->lchild = t->lchild;
  72. if(fa->data > t->data){
  73. fa->lchild = p;
  74. free(t);
  75. }
  76. else{
  77. fa->rchild = p;
  78. free(t);
  79. }
  80. }
  81. }
  82. //寻找要删除的节点
  83. int delsearch(btree t,btree fa,int data){
  84. if(t == NULL)
  85. return 0;
  86. if(t->data == data)
  87. del(t,fa);
  88. if(t->data > data) return delsearch(t->lchild,t,data);
  89. if(t->data < data) return delsearch(t->rchild,t,data);
  90. }
  91. int main(){
  92. char op;
  93. int num;
  94. btree t = NULL;
  95. while(scanf("%c",&op) != EOF){
  96. if(op == 'p'){
  97. printbst(t);
  98. putchar('\n');
  99. getchar();
  100. continue;
  101. }
  102. scanf("%d",&num);
  103. if(op == 'i'){
  104. if(t == NULL){
  105. t = (btree)malloc(sizeof(btree));
  106. t->lchild = NULL;
  107. t->rchild = NULL;
  108. t->data = num;
  109. puts("inserted");
  110. getchar();
  111. continue;
  112. }
  113. if(insert(t,NULL,num))
  114. puts("inserted");
  115. else
  116. puts("not inserted");
  117. }
  118. if(op == 's'){
  119. if(search(t,num))
  120. puts("present");
  121. else
  122. puts("absent");
  123. }
  124. if(op == 'd'){
  125. if(delsearch(t,NULL,num))
  126. puts("deleted");
  127. else
  128. puts("not deleted");
  129. }
  130. getchar();
  131. }
  132. return 0;
  133. }
  134. /*
  135. i 50
  136. i 70
  137. i 25
  138. i 70
  139. i 55
  140. d 55
  141. p
  142. s 55
  143. s 60
  144. p
  145. */

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号