91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現用C++表達式求值

發布時間:2021-10-09 11:29:52 來源:億速云 閱讀:155 作者:iii 欄目:開發技術

這篇文章主要講解了“如何實現用C++表達式求值”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何實現用C++表達式求值”吧!

目錄
  • 一.細節處理:

    • 1.注意負數 因此要進行字符串預處理

    • 2.考慮除數為0

    • 3.原字符串再加上一個定界符 '#'

    • 4.優先級:

  • 二.知識要點:

    • 三.完整源碼:

      一.細節處理:

      1.注意負數 因此要進行字符串預處理

      string format(string str) 
      {
      	int len = str.length();
      	for (int i = 0; i < len; i++)
      	{
      		if (str[i] == '-')
      		{
      			if (i == 0) { str.insert(0, 1, '0'); }//處理-3*2+1情況
      			else if (str[i - 1]=='(') { str.insert(i, 1, '0'); }//處理(-3*4+1)情況
      		}
      	}
      	return str;
      }

      2.考慮除數為0

      case '/':
      					if (0 != y) { res = x / y; }
      					else { cout << "非法表達式"; return -1; }
      					break;

      3.原字符串再加上一個定界符 '#'

      str=str+'#'

      4.優先級:

      1."("未入棧前為3 入棧后為0 2.”)"和"#"為0 3.”+" "-"為1 4.”*"和"/"為2

      二.知識要點:

      中綴表達式轉為后綴表達式

      1. 首先設置存儲運算符和存儲操作數兩個棧 即Symbol[N]和Num[N]且分別對應top2,top1

      top1=-1 Symbol[0]='#' //運算符棧設置定界符 top2=0

      2.入棧和出棧的規則 字符串為str

      一.若str[i]>='0&&str[i]<='9',則入操作數棧并繼續掃描以一個字符 即Num[++top1]=str[i++]-'0';

      二.否則 將當前字符str1與運算符棧的棧頂元素str2進行優先級比較 ,自寫比較函數

      例如: str1==‘+' 則若str2==# ,(,) 則返回1 說明str1比str2優先級高

      1. 此時若str1優先級大于str2 則將str1入運算符棧并繼續掃描 即 Symbol[++top2]=str[i++]

      2.優先級相等則返回0 此時將運算符棧頂元素彈出,并繼續掃描下一個字符即 top2-- i++

      3.若str1優先級小于str2返回-1,此時將運算符棧頂元素彈出 即op=Symbol[top2--]

      并彈出操作數棧的兩個元素 即y=Num[top1--],x=Num[top1--] 之后進行計算操作

      三.最后 return Num[top1]

      三.完整源碼:

      #define _CRT_SECURE_NO_WARNINGS
      #include<bits/stdc++.h>
      using namespace std;
      class Expression
      {
      public:
      	Expression(string str);
      	~Expression();
      	int Compute();
      private:
      	int Comp(char str1, char str2);
      	string str1;
      };
      Expression::Expression(string str)
      {
      	this->str1 = str + '#';//以定界符開頭
      }
      Expression :: ~Expression() {}
      //將中綴表達轉為后綴表達
      int Expression::Compute()
      {
      	int Num[100], Symbol[100];//定義存操作數和運算符的兩個棧
      	int i, k, x, y, res;
      	char op;
      	Symbol[0] = '#';
      	int top1 = -1, top2 = 0;
      	for (i = 0; str1[i] != '\0';)
      	{
      		if (str1[i] >= '0' && str1[i] <= '9') { Num[++top1] = str1[i++] - '0'; }
      		else {//非操作數就比較運算符優先級
      			int cmp = Comp(str1[i], Symbol[top2]);
      			if (cmp == 1) { Symbol[++top2] = str1[i++]; }//將運算符入棧 并接著掃描下一個字符
      			else if (cmp == 0) { --top2; i++; }//優先級相等 彈棧 并接著掃描下一個字符
      			else {//優先級低 繼續處理當前運算符
      				y = Num[top1--];//后面的數要先彈出來 才不會算反
      				x= Num[top1--];
      				op = Symbol[top2--];
      				switch (op)
      				{
      				case '+':
      					res = x + y;//將運算結果入棧
      					break;
      				case '-':
      					res = x - y;
      					break;
      				case '*':
      					res = x * y;
      					break;
      				case '/':
      					if (0 != y) { res = x / y; }
      					else { cout << "非法表達式"; return -1; }
      					break;
      				default:break;
      				}
      				Num[++top1] = res;
      			}
      		}
      	}
      	return Num[top1]; 
      }
      string format(string str) 
      {
      	int len = str.length();
      	for (int i = 0; i < len; i++)
      	{
      		if (str[i] == '-')
      		{
      			if (i == 0) { str.insert(0, 1, '0'); }//處理-3*2+1情況
      			else if (str[i - 1]=='(') { str.insert(i, 1, '0'); }//處理(-3*4+1)情況
      		}
      	}
      	return str;
      }
      int main()
      {
      	string str;
      	int n = 3;
      	while (n--)
      	{
      		cout << "請輸入一個表達式: " << endl;
      		cin >> str;
      		str = format(str);
      		Expression E(str);
      		int result = E.Compute();
      		cout << "表達式的值的是: " << result << endl;
      	}
      	return 0;
      }
      int Expression::Comp(char str1, char str2)//當前字符元素和棧頂運算符優先級比較
      {
      	//1代表 str1優先級大于str2 0 代表相等 -1代表小于
      	switch (str1)
      	{
      	case'+':case'-': 
      		if (str2 == '#'||str2==')'||str2=='(') { return 1; }//左括號入隊列后優先級變為0
      		else { return -1; }
      		break;
      	case'*':case'/':
      		if (str2 == '*' || str2 == '/') { return -1; }
      		else  { return 1; }
      		break;
      	case'(':
      		return 1;
      		break;
      	case')':
      		if (str2 == '(') { return 0; }
      		else if(str2 == '#') { return 1; }
      		else { return -1; }
      		break;
      	case'#':
      		if (str2 == '#') { return 0; }
      		else { return -1; }
      		break;
      	default: break;
      	}
      }

      感謝各位的閱讀,以上就是“如何實現用C++表達式求值”的內容了,經過本文的學習后,相信大家對如何實現用C++表達式求值這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

      向AI問一下細節

      免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

      c++
      AI

      鸡西市| 文化| 房产| 海口市| 仪陇县| 临洮县| 丹东市| 麦盖提县| 公安县| 保定市| 汉沽区| 井陉县| 内乡县| 西丰县| 江陵县| 金川县| 上蔡县| 海南省| 陇南市| 宝清县| 峨山| 怀柔区| 怀仁县| 资讯| 乡城县| 筠连县| 甘泉县| 新巴尔虎左旗| 监利县| 怀仁县| 玉树县| 台北县| 广东省| 东海县| 伊宁县| 滕州市| 永嘉县| 城固县| 寿宁县| 志丹县| 镇江市|