Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.75 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. struct Stack{
  6. char Operator;
  7. int LevelOperator;
  8. struct Stack *prev;
  9. struct Stack *next;
  10. }*head, *tail, *curr;
  11.  
  12. char InputString[150];
  13. char OutputString[150];
  14. int OutIdx = 0;
  15.  
  16. int CheckLevel(char s){
  17. if(s == '^') return 1;
  18. else if(s == '*' || s == '/') return 2;
  19. else if(s == '+' || s == '-') return 3;
  20.  
  21. return -1;
  22. }
  23.  
  24. void Push(char Op){
  25. curr = (struct Stack*) malloc(sizeof(struct Stack));
  26. curr->Operator = Op;
  27. if(CheckLevel(Op) != -1) curr->LevelOperator = CheckLevel(Op);
  28.  
  29. if(head == NULL){
  30. head = tail = curr;
  31. head->prev = NULL;
  32. tail->next = NULL;
  33. }else{
  34. tail->next = curr;
  35. curr->prev = tail;
  36. curr->next = NULL;
  37. tail = curr;
  38. }
  39. }
  40.  
  41. void Pop(){
  42. if(head == NULL) return;
  43.  
  44. if(head == tail){
  45. free(head);
  46. head = tail = NULL;
  47. }else{
  48. curr = tail->prev;
  49. curr->next = NULL;
  50. free(tail);
  51. }
  52. }
  53.  
  54. void PopToOut(char s){
  55. int LevelNow = CheckLevel(s);
  56.  
  57. // if(head == tail){
  58. // OutputString[OutIdx++] = curr->Operator;
  59. // Pop();
  60. // return;
  61. // }
  62.  
  63. curr = tail;
  64. while(curr != NULL){
  65. if(head == tail && tail->LevelOperator <= LevelNow){
  66. OutputString[OutIdx++] = tail->Operator;
  67. Pop();
  68. break;
  69. // 3 <= 2
  70. }else if(curr->LevelOperator <= LevelNow){
  71. OutputString[OutIdx++] = curr->Operator;
  72. Pop();
  73. }else{
  74.  
  75. }
  76. curr = curr->prev;
  77. }
  78. Push(s);
  79. }
  80.  
  81. void MoveOut(char s){
  82. OutputString[OutIdx] = s;
  83. OutIdx++;
  84. }
  85.  
  86. void Postfix(){
  87.  
  88. for(int a=0; a<strlen(InputString) ; a++){
  89. printf("%d %s\n", a, OutputString);
  90.  
  91. if(a == 0 ){
  92. MoveOut(InputString[a]);
  93. continue;
  94. }
  95.  
  96. if(head == NULL){
  97. if(a == 6) printf("test 6 null\n");
  98. Push(InputString[a]);
  99. }else if(InputString[a] == '^'){
  100. if(a == 6) printf("test 6 ^\n");
  101. if(tail->LevelOperator >= 1){
  102. PopToOut(InputString[a]);
  103. }
  104. }else if(InputString[a] == '*' || InputString[a] == '/'){
  105. if(a == 6) printf("test 6 */\n");
  106. if(tail->LevelOperator > 2) Push(InputString[a]);
  107. else if(tail->LevelOperator <= 2){
  108. PopToOut(InputString[a]);
  109. }
  110. }else if(InputString[a] == '+' || InputString[a] == '-'){
  111. if(a == 6) printf("test 6 else +-\n");
  112. if(tail->LevelOperator <= 3){
  113. PopToOut(InputString[a]);
  114. }
  115. }else{
  116. if(a == 6) printf("test 6 else\n");
  117. MoveOut(InputString[a]);
  118. }
  119. }
  120.  
  121. if(head == tail){
  122. printf("test 6 print tail\n");
  123. OutputString[OutIdx++] = tail->Operator;
  124. }else{
  125. printf("test 6print else\n");
  126. if(tail != NULL){
  127. curr = tail;
  128. while(curr != NULL){
  129. OutputString[OutIdx++] = curr->Operator;
  130. curr = curr->prev;
  131. }
  132. }
  133. }
  134.  
  135.  
  136. }
  137.  
  138. int main(){
  139.  
  140. scanf("%s", InputString);
  141. Postfix();
  142. printf("%s\n", OutputString);
  143.  
  144. return 0;
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement