先將中綴表示式利用棧轉換為字尾表示式,然後再利用棧由字尾表示式計算算數表示式的值,具體**如下:
#include using namespace std;
#include #include #include enum type
;enum operat
;struct cell
;//input = 1 + ((2 + 3) * 4) - 5;
//中綴到字尾
string topolishnotation(const char* input)
s2.push(' ');
--icount; //最後會統一加1,所以先減一
} //是運算子比較其與s1棧頂運算子的優先順序
while (input[icount] == '+' || input[icount] == '-' ||
input[icount] == '*' || input[icount] == '/')
//否則,若優先順序比棧頂運算子的高,也將運算子壓入s1
else if ((input[icount] == '*' || input[icount] == '/') &&
(s1.top() == '+' || s1.top() == '-'))
//否則,將s1棧頂的運算子彈出並壓入到s2中,再次與s1中新的棧頂運算子相比較
else
}//如果是左括號「(」,則直接壓入s1;
if (input[icount] == '(')
/*如果是右括號「)」,則依次彈出s1棧頂的運算子,並壓入s2,
*直到遇到左括號為止,此時將這一對括號丟棄;*/
if (input[icount] == ')')
s1.pop(); //將'('也出棧
} ++icount; //統一加一次
} //將s1中剩餘的運算子依次彈出並壓入s2;
while (!s1.empty())
string ret;
while (!s2.empty())
reverse(ret.begin(), ret.end());
return ret;
}//字尾到陣列
vectorstrbehindtovect(const string& strbehind)
call.push_back();
--icount;
} else if (strbehind[icount] == '+')
);} else if (strbehind[icount] == '-')
);} else if (strbehind[icount] == '*')
);} else if (strbehind[icount] == '/')
);} ++icount;
} return call;
}//計算值
int rpncount(const vector& array, size_t size)
else
val.top() /= right;
break;
default:
cout << "請輸入合法字元" << endl;
exit(0);
}/*switch*/
} }return val.top();
}int main()
catch (cell)
system("pause");
return 0;
}
算數表示式的計算
一 算數表示式的兩種表示 在計算機中進行算數表示式的計算是通過棧來實現的。算數表示式的兩種表示方法 即中綴表示式和字尾表示式。把雙目運算子出現在兩個運算元中間的這種習慣表示叫做算數表示式的中綴表示,這種算數表示式被稱為中綴算數表示式或中綴表示式。就是平常我們習慣的表示方式 例如 2 5 6 中綴表示...
鏈棧以及順序棧應用 算數表示式
利用鏈棧將中綴表示式轉化為字尾表示式,然後利用順序棧進行掃瞄計算,返回結果 書上的 1 include 2 include 3 include 4 define size 50 5using namespace std 6 typedef struct node 7 linkstack,stackn...
Dijkstra的雙棧算數表示式求值演算法
說明 這個演算法的輸入要求是必須補全所有括號,否則演算法會出錯,數字和符號之間應該留有乙個空格。import edu.princeton.cs.algs4.stack import edu.princeton.cs.algs4.stdin import edu.princeton.cs.algs4....