Странный результат вычисления строки в обратной польской записи - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Ввожу строку, преобразовывает ок, но считает как-то криво Например 100+2 = 200, а 123+3 = 446 хотя в основном считает нормально, отслеживая пошагово, то действия выполняются правильно
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <iostream>
  4. #include <string.h>
  5. #include <conio.h>
  6.  
  7. struct list {
  8. int data;
  9. struct list * next;
  10. };
  11. typedef struct stack
  12. {
  13. struct list *top;
  14. } Stack;
  15. void makenull (Stack *S)
  16. {
  17. struct list *p;
  18. while (S->top)
  19. {
  20. p = S->top;
  21. S->top = p->next;
  22. delete(p);
  23. }
  24. }
  25. void create (Stack *S)
  26. {
  27. S->top = NULL;
  28. }
  29. int top (Stack *S)
  30. {
  31. if (S->top)
  32. return (S->top->data);
  33. else
  34. return 0;
  35. }
  36. int pop(Stack *S)
  37. {
  38. int a;
  39. struct list *p;
  40. p = S->top;
  41. a = p->data;
  42. S-> top = p->next;
  43. delete(p);
  44. return a;
  45. }
  46. void push(int a, Stack *S)
  47. {
  48. struct list *p;
  49. p = new struct list;
  50. p->data = a;
  51. p->next = S-> top;
  52. S->top = p ;
  53. }
  54.  
  55. int empty (Stack *S)
  56. {
  57. return (S->top == NULL);
  58. }
  59. int major(char o)
  60. {
  61. if ((o=='+') || (o=='-'))
  62. return 2;
  63. else if ((o=='(') || (o==')'))
  64. return 1;
  65. else if ((o=='*') || (o=='/'))
  66. return 3;
  67. }
  68. int major(Stack *o)
  69. {
  70. if ((o->top->data=='+') || (o->top->data=='-'))
  71. return 2;
  72. else if ((o->top->data=='(') || (o->top->data==')'))
  73. return 1;
  74. else if ((o->top->data=='*') || (o->top->data=='/'))
  75. return 3;
  76. }
  77. void main()
  78. {
  79. Stack * S = new Stack;
  80. create(S);
  81. int k=0;
  82. char x;
  83. char s_in[256]={0}, s_out[256]={0};
  84. scanf("%s", &s_in);
  85. int len = strlen(s_in);
  86. for (int i=0; i<len; i++)
  87. {
  88. x=s_in[i];
  89. if ((x!='+')&&(x!='-')&&(x!='*')&&(x!='/')&&(x!='(')&&(x!=')')&&(x!=' '))
  90. {
  91. s_out[k++]=x;
  92. if ((s_in[i+1]=='+')||(s_in[i+1]=='-')||(s_in[i+1]=='*')||(s_in[i+1]=='/')||(s_in[i+1]=='(')||(s_in[i+1]==')')||(s_in[i+1]==' '))
  93. {
  94. s_out[k++]=' ';
  95. }
  96. }
  97. else if (x=='(')
  98. push(x, S);
  99. else if ((x=='+')||(x=='-')||(x=='*')||(x=='/')&&(x!='(')&&(x!=')'))
  100. {
  101. while ((empty(S)!=1)&&(major(S)>=major(x)))
  102. s_out[k++]=pop(S);
  103. push(x,S);
  104. }
  105. else if (x==')')
  106. {
  107. while (S->top->data!='(')
  108. s_out[k++] = pop(S);
  109. pop(S);
  110. }
  111. }
  112. if (empty(S)!=1)
  113. {
  114. while (empty(S)!=1)
  115. s_out[k++]=pop(S);
  116. s_out[k++]=' ';
  117. }
  118. std::cout<<s_out;
  119. makenull(S);
  120. char b[256]={0}; int l=0;
  121. int len2 = strlen(s_out);
  122. for (int i=0; i<len2; i++)
  123. {
  124. x = s_out[i];
  125. if ((x!='+')&&(x!='-')&&(x!='*')&&(x!='/')&&(x!=' '))
  126. {
  127. b[l++]=x;
  128. if ((s_out[i+1]=='+')||(s_out[i+1]=='-')||(s_out[i+1]=='*')||(s_out[i+1]=='/')||(s_out[i+1]==' ')||(s_out[i+1]==0))
  129. {
  130. push(atoi(b), S);
  131. *(b)=0; l=0;
  132. }
  133. }
  134. else if ((x=='+')||(x=='-')||(x=='*')||(x=='/'))
  135. {
  136. int m=0;
  137. switch (x)
  138. {
  139. case '+': m=pop(S)+pop(S);
  140. break;
  141. case '-': m=pop(S)-pop(S);
  142. break;
  143. case '/': m=pop(S)/pop(S);
  144. break;
  145. case '*': m=pop(S)*pop(S);
  146. break;
  147. }
  148. push(m, S);
  149. }
  150. }
  151. if (empty(S)!=1)
  152. {
  153. std::cout <<"="<<S->top->data;
  154. }
  155. makenull(S);
  156. getch();
  157. }
Листинг программы
  1. char b[256]={0}; int l=0;
  2. int len2 = strlen(s_out);
  3. for (int i=0; i<len2; i++)
  4. {
  5. x = s_out[i];
  6. if ((x!='+')&&(x!='-')&&(x!='*')&&(x!='/')&&(x!=' '))
  7. {
  8. b[l++]=x;
  9. if ((s_out[i+1]=='+')||(s_out[i+1]=='-')||(s_out[i+1]=='*')||(s_out[i+1]=='/')||(s_out[i+1]==' ')||(s_out[i+1]==0))
  10. {
  11. push(atoi(b), S);
  12. *(b)=0; l=0;
  13. }
  14. }
  15. else if ((x=='+')||(x=='-')||(x=='*')||(x=='/'))
  16. {
  17. int m=0;
  18. switch (x)
  19. {
  20. case '+': m=pop(S)+pop(S);
  21. break;
  22. case '-': m=pop(S)-pop(S);
  23. break;
  24. case '/': m=pop(S)/pop(S);
  25. break;
  26. case '*': m=pop(S)*pop(S);
  27. break;
  28. }
  29. push(m, S);
  30. }
  31. }
  32. if (empty(S)!=1)
  33. {
  34. std::cout <<"="<<S->top->data;
  35. }
Не могу найти что не так. Заранее спасибо!

Решение задачи: «Странный результат вычисления строки в обратной польской записи»

textual
Листинг программы
  1. case 'cos':

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы