fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  5.  
  6. char data[5];//運算元 1234..........
  7. char opstack[5];//放運算子
  8. int top=-1,optop=-1;//top紀錄運算元堆疊、optop紀錄運算子堆疊
  9.  
  10. char oppop(){
  11. char sym;
  12. sym=opstack[optop];
  13. optop--;
  14. return sym;
  15. }
  16.  
  17. void oppush(char strstack){
  18. opstack[++optop]=strstack;
  19. }
  20. //上方是運算子、下方是運算元
  21. int pop(){
  22. int num;
  23. num=data[top]-'0';
  24. top=top-1;
  25. return num;
  26. }
  27.  
  28. void push(char strdata){
  29. data[++top]=strdata;
  30. }
  31.  
  32.  
  33.  
  34. int main(int argc, char *argv[]) {
  35. char str[25];
  36. int f=0,i=0;//f為旗標
  37. char token='\0';
  38. int ans,length;
  39.  
  40. puts("請輸入字串:");
  41. gets(str);
  42. length = strlen(str);
  43. puts("輸入的字串為:");
  44. printf("字串=%s ; 長度=%d \n",str,length);
  45. printf("-----------------------\n");
  46.  
  47. while(f==0){
  48. if(str[i]>='0'&& str[i]<='9'){//若是數字丟入運算元陣列
  49. push(str[i]);
  50. i++;//i計算算式字串位置
  51. continue;
  52. }else if(str[i]=='*' || str[i]=='/' || str[i]=='+' || str[i]=='-'){
  53. if(str[i]=='+' || str[i]=='-'){//若是運算子,先判斷optop運算子堆疊是否有內容
  54. if(optop>=0){//有內容才判斷優先權
  55. if(opstack[optop]=='*' || opstack[optop]=='/'){
  56. token=oppop();
  57. switch(token){
  58. case '*':
  59. ans=pop()*pop();
  60. push(ans);
  61. break;
  62. case '/':
  63. ans=pop()/pop();
  64. push(ans);
  65. break;
  66. }
  67. oppush(str[i]);
  68. i++;
  69. }else{//若堆疊內運算子是+-則直接放入
  70. oppush(str[i]);
  71. i++;
  72. }
  73. }else{//運算子堆疊無內容直接放入
  74. oppush(str[i]);
  75. i++;
  76. }
  77. }else{//判斷*/優先權
  78. if(optop>=0){//同上方
  79. if(opstack[optop]=='*' || opstack[optop]=='/'){
  80. token=oppop();
  81. switch(token){
  82. case '*':
  83. ans=pop()*pop();
  84. push(ans);
  85. break;
  86. case '/':
  87. ans=pop()/pop();
  88. push(ans);
  89. break;
  90. }
  91. oppush(str[i]);
  92. i++;
  93. }else{
  94. oppush(str[i]);
  95. i++;
  96. }
  97. }else{
  98. oppush(str[i]);
  99. i++;
  100. }
  101. }
  102. }else{
  103. f=1;
  104. }
  105. }
  106.  
  107. while(optop>=0){//最後拿出剩下的運算元堆疊與運算子堆疊倆倆運算
  108. token=oppop();
  109. switch(token){
  110. case '+':
  111. ans=pop()+pop();
  112. push(ans);
  113. break;
  114. case '-':
  115. ans=pop()+pop();
  116. push(ans);
  117. break;
  118. case '*':
  119. ans=pop()*pop();
  120. push(ans);
  121. break;
  122. case '/':
  123. ans=pop()/pop();
  124. push(ans);
  125. break;
  126. default:
  127. ans=pop();
  128. break;
  129. }
  130. optop--;
  131. }
  132.  
  133. printf("答案是%d \n",ans);
  134.  
  135.  
  136.  
  137. return 0;
  138. }
Success #stdin #stdout 0s 2164KB
stdin
Standard input is empty
stdout
請輸入字串:
輸入的字串為:
字串=�rﯿ��rﯿ/ ; 長度=14 
-----------------------
答案是-1