簡體   English   中英

使用堆棧的計算器程序

[英]Calculator Program using stack

我正在使用棧在c中編寫一個計算器程序,在下面的程序中,我使用了中綴的概念進行后綴轉換和下一個后綴評估。 我得到的正確答案是1 + 2的答案是3,但對於11 + 1或任意兩個或更多數字,我得到了錯誤的答案。

任何人都可以幫助我在代碼中包含的內容,以便它可以使用兩位數以上的數字,例如28 + 25或任何數字嗎?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define SIZE 50            /* Size of Stack */

int top = -1;
char pofx[50];
char s[SIZE];
int infix_to_postfix() {

  char infx[50], ch;
  int i = 0, k = 0;

  void push(char elem) { /* Function for PUSH operation */
    s[++top] = elem;
  }

  char pop() { /* Function for POP operation */
    return (s[top--]);
  }

  int pr(char elem) { /* Function for precedence */
    switch (elem) {
      case '#':
        return 0;
      case '(':
        return 1;
      case '+':
      case '-':
        return 2;
      case '*':
      case '/':
        return 3;
    }
    return -1;
  }
  printf("\n\nEnter a Value to calculate : ");
  gets(infx);
  push('#');
  while ((ch = infx[i++]) != '\0') {
    if (ch == '(') push(ch);
    else if (isalnum(ch)) pofx[k++] = ch;
    else if (ch == ')') {
      while (s[top] != '(')
        pofx[k++] = pop();
      char elem = pop(); /* Remove ( */
    } else { /* Operator */
      while (pr(s[top]) >= pr(ch))
        pofx[k++] = pop();
      push(ch);
    }
  }
  while (s[top] != '#') /* Pop from stack till empty */
    pofx[k++] = pop();
  pofx[k] = '\0'; /* Make pofx as valid string */
  printf("\n\nGiven Infix Expn: %s  Postfix Expn: %s\n", infx, pofx);

  return (int) pofx[k];
}

void postfix_evaluate() {

  char ch;
  int i = 0, op1, op2;
  void pushit(int elem) { /* Function for PUSH operation */
    s[++top] = elem;
  }

  int popit() { /* Function for POP operation */
    return (s[top--]);
  }
  infix_to_postfix();
  while ((ch = pofx[i++]) != '\0') {
    if (isdigit(ch)) pushit(ch - '0'); /* Push the operand */
    else { /* Operator,pop two  operands */
      op2 = popit();
      op1 = popit();
      switch (ch) {
        case '+':
          pushit(op1 + op2);
          break;
        case '-':
          pushit(op1 - op2);
          break;
        case '*':
          pushit(op1 * op2);
          break;
        case '/':
          pushit(op1 / op2);
          break;
      }
    }
  }
  printf("\n Given Postfix Expn: %s\n", pofx);
  printf("\n Result after Evaluation: %d\n", s[top]);
}

int main() {
  postfix_evaluate();
  return 0;
}

我自己的代碼的一部分可能會有用:

if (isdigit(gi.n.nch))
{
gi.x = chr2num(gi.n.nch);
gi.n= nextchar( gi.n, len, instr);
while(isdigit(gi.n.nch))
{
    gi.x *= 10;
    gi.x += chr2num(gi.n.nch);
    gi.n= nextchar( gi.n, len, instr);
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM