Board logo

標題: 數學表達式的字符串 求值 [打印本頁]

作者: may    時間: 2023-5-10 15:44     標題: 數學表達式的字符串 求值

3. 給定一個表示數學表達式的字符串,例如“(((1+(2*3))+4)-5)”。
輸入將僅包含:數字 0-9運算符“+”、“-”、“*”、“/”  括弧 ”(”,”)” 完成 C 函數 int evaluate() 以評估表達式並返回結果。 您可以假設輸入格式正確並且不包含任何語法錯誤。 您應該使用數組和指針來處理輸入字符串。

#include <stdio.h>
#include<stdlib.h>
#define MAX_EXPRESSION_LENGTH 100
int main() {
char expression[MAX_EXPRESSION_LENGTH];
printf("Enter the expression: ");
fgets(expression, MAX_EXPRESSION_LENGTH, stdin);
int result = evaluate(expression);
printf("Result: %d\n", result); return 0;
}
int evaluate(char *expression) {
//Write your code here
作者: may    時間: 2023-5-10 17:12     標題: 計算器完整版_C++

  1. #include <iostream>
  2. #include <stack>
  3. #include <string>
  4. #include <unordered_map>
  5. using namespace std;

  6. stack<int> num;
  7. stack<char> op;

  8. //優先級表
  9. unordered_map<char, int> h{ {'+', 1}, {'-', 1}, {'*',2}, {'/', 2} };


  10. void eval()//求值
  11. {
  12.     int a = num.top();//第二操作數
  13.     num.pop();

  14.     int b = num.top();//第一操作數
  15.     num.pop();

  16.     char p = op.top();//運算符
  17.     op.pop();

  18.     int r = 0;//結果

  19.     //計算結果
  20.     if (p == '+') r = b + a;
  21.     if (p == '-') r = b - a;
  22.     if (p == '*') r = b * a;
  23.     if (p == '/') r = b / a;

  24.     num.push(r);//結果入stack
  25. }

  26. int main()
  27. {
  28.     string s;//讀入表達式
  29.     cin >> s;

  30.     for (int i = 0; i < s.size(); i++)
  31.     {
  32.         if (isdigit(s[i]))//數字入
  33.         {
  34.             int x = 0, j = i;//計算數字
  35.             while (j < s.size() && isdigit(s[j]))
  36.             {
  37.                 x = x * 10 + s[j] - '0';
  38.                 j++;
  39.             }
  40.             num.push(x);//數字入stack
  41.             i = j - 1;
  42.         }
  43.         //左括號無優先級,直接入stack
  44.         else if (s[i] == '(')//左括號入stack
  45.         {
  46.             op.push(s[i]); }
  47.         //括號特殊,遇到左括號直接stack,遇到右括號計算括號裡面的
  48.         else if (s[i] == ')')//右括號
  49.         {
  50.             while(op.top() != '(')//一直計算到左括號
  51.                 eval();
  52.             op.pop();//左括號出stack
  53.         }
  54.         else
  55.         {
  56.             while (op.size() && h[op.top()] >= h[s[i]])//待入stack運算符優先級低,則先計算
  57.                 eval();i
  58.             op.push(s[i]);//操作符入stack
  59.         }
  60.     }
  61.     while (op.size()) eval();//剩餘的進行計算
  62.     cout << num.top() << endl;//輸出结果
  63.     return 0;
  64. }
複製代碼





歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://seed.istak.org.tw/) Powered by Discuz! 7.2