WHCSRL 技术网

中缀表达式转后缀表达式(个位数四则运算,C语言)_zhan

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct stack{
  4. char *data;
  5. int top;
  6. int maxSize;
  7. };
  8. struct stack *createStack(int maxsize){
  9. struct stack *s;
  10. s=(struct stack *)malloc(sizeof(struct stack));
  11. s->data=(char *)malloc(sizeof(char)*maxsize);
  12. s->top=-1;
  13. s->maxSize=maxsize;
  14. return s;
  15. }
  16. int isFull(struct stack *s){
  17. return s->top==s->maxSize-1;
  18. }
  19. int isEmpty(struct stack *s){
  20. return s->top==-1;
  21. }
  22. void push(struct stack *s,char ch){
  23. if(isFull(s)){
  24. printf("stack is full ");
  25. return;
  26. }
  27. s->data[++s->top]=ch;
  28. }
  29. char pop(struct stack *s){
  30. if(isEmpty(s)){
  31. printf("stack is empty ");
  32. exit(-1);
  33. }
  34. return s->data[s->top--];
  35. }
  36. struct queue{
  37. char *data;
  38. int front,rear;
  39. int size;
  40. int maxsize;
  41. };
  42. struct queue *create(int maxSize){
  43. struct queue *q;
  44. q=(struct queue *)malloc(sizeof(struct queue));
  45. q->data=(char *)malloc(sizeof(char)*maxSize);
  46. q->front=q->rear=0;
  47. q->size=0;
  48. q->maxsize=maxSize;
  49. return q;
  50. }
  51. void inqueue(struct queue *q,char ch){/*入队*/
  52. if(q->size==q->maxsize){
  53. printf("queue is full ");
  54. return;
  55. }
  56. q->data[q->rear++]=ch;
  57. if(q->rear==q->maxsize){
  58. q->rear=0;
  59. }
  60. q->size++;
  61. }
  62. char dequeue(struct queue *q){/*出队*/
  63. if(q->size==0){
  64. printf("queue is empty ");
  65. exit(-1);
  66. }
  67. char temp = q->data[q->front++];
  68. if(q->front==q->maxsize){
  69. q->front=0;
  70. }
  71. q->size--;
  72. return temp;
  73. }
  74. void PrintQueue(struct queue *q){/*打印队列中所有元素,从队头到队尾*/
  75. int temp=q->front;
  76. for(int i=0;i<q->size;i++){
  77. printf("%%c ",q->data[temp++]);
  78. temp=temp%%q->maxsize;
  79. }
  80. }
  81. int no_priority(int map[4][4],char ch1,char ch2){
  82. int i,j;
  83. switch(ch1){
  84. case '+':i=0;break;
  85. case '-':i=1;break;
  86. case '*':i=2;break;
  87. case '/':i=3;break;
  88. default:printf("error.");
  89. }
  90. switch(ch2){
  91. case '+':j=0;break;
  92. case '-':j=1;break;
  93. case '*':j=2;break;
  94. case '/':j=3;break;
  95. default:printf("error.");
  96. }
  97. return map[i][j];
  98. }
  99. int main(){
  100. int map[4][4]={/*运算符优先关系矩阵*/
  101. 1,1,1,1,
  102. 1,1,1,1,
  103. 0,0,1,1,
  104. 0,0,1,1,
  105. };
  106. struct stack *s;
  107. int n=20;
  108. s=createStack(n);
  109. char str[n];
  110. printf("请输入中缀表达式:");
  111. scanf("%%s",str);
  112. struct queue *q;
  113. q=create(n);
  114. int k=0;
  115. while(str[k]!=''){
  116. if(str[k]>=48&&str[k]<=57){/*遇到数据直接入队*/
  117. inqueue(q,str[k]);
  118. }else if(isEmpty(s)||str[k]=='('){/*如果栈为空或者访问到(直接压栈*/
  119. push(s,str[k]);
  120. }else if(str[k]==')'){/*遇到)时弹栈,如果弹出元素不是(,要将弹出元素存入队列,再弹栈,再判断,反复操作*/
  121. char ch=pop(s);
  122. while(ch!='('){
  123. inqueue(q,ch);
  124. ch=pop(s);
  125. }
  126. }else{/*当栈不空,栈顶元素不为(且访问元素优先级小于等于栈顶元素时要不断弹栈并将弹出元素入队,最后将访问元素符号压栈*/
  127. while(!isEmpty(s)&&s->data[s->top]!='('&&no_priority(map,str[k],s->data[s->top])){
  128. char ch=pop(s);
  129. inqueue(q,ch);
  130. }
  131. push(s,str[k]);
  132. }
  133. k++;
  134. }
  135. while(!isEmpty(s)){/*中缀表达式遍历完成后还有部分符号留在栈中,要将他们弹出入队*/
  136. char ch=pop(s);
  137. inqueue(q,ch);
  138. }
  139. printf("后缀表达式: ");
  140. PrintQueue(q);/*输出队列中的后缀表达式*/
  141. return 0;
  142. }

推荐阅读