#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <stack>
using namespace std
bool isOp(string& op){
if(op==("+")||op==("-")||op==("*")||op==("/")||op==("(")||op==(")")) return true
else return false
}
int pri(string& op){
if(op==("+")||op==("-")||op==("(")) return 1
else if(op==("*")||op==("/")) return 2
else return 0
}
string twoResult(string& op,string& a,string& b){
double x=atof(b.c_str()),y=atof(a.c_str()),z=0
string result
stringstream ss
if(op==("+")) z=x+y
else if(op==("-")) z=x-y
else if(op==("*")) z=x*y
else if(op==("/")) z=x/y
else z=0
ss<<zss>>result
return result
}
vector<string> read(string input){
vector<string> exp
const string op="+-*/()"
static const basic_string <string>::size_type npos=-1
for(int i=0,pos=0i<input.length()i++){
if(op.find(input[i])!=npos){
if(op.find(input[pos])==npos){
exp.push_back(input.substr(pos,i-pos))
}
exp.push_back(input.substr(i,1))
pos=i+1
continue
}
if(i==input.length()-1 && op.find(input[i])==npos){
exp.push_back(input.substr(pos))
}
}
return exp
}
vector<string> toRight(vector<string>& exp){
stack<string> as
vector<string> right
string op
int pos=0
while(true){
if(isOp(exp.at(pos))){
if(as.empty()||(exp.at(pos))==("(")){
as.push(exp.at(pos))
}
else{
if((exp.at(pos))==(")")){
if((as.top())!=("(")){
op=as.top()as.pop()
right.push_back(op)
}
}
else{
if(pri(exp.at(pos))<=pri(as.top())&&(!as.empty())){
op=as.top()as.pop()
if(op!=("(")) right.push_back(op)
}
as.push(exp.at(pos))
}
}
}
else right.push_back(exp.at(pos))
pos++
if(pos>=exp.size()) break
}
while(!as.empty()){
op=as.top()as.pop()
right.push_back(op)
}
return right
}
double getResult(vector<string>& right){
stack<string> temp
string op1,op2
vector<string>::iterator v_it
for(v_it=right.begin()v_it!=right.end()v_it++){
if(isOp(*v_it)){
op1=temp.top()temp.pop()
op2=temp.top()temp.pop()
temp.push(twoResult(*v_it,op1,op2))
}
else temp.push(*v_it)
}
return atof(temp.top().c_str())
}
void main(){
string input
for(){
cout<<"输入表达式或输入Q退出:"
cin>>input
if(input==("q")) break
else{
vector<string> exp=read(input)
cout<<input<<"="<<getResult(toRight(exp))<<endl
}
}
}
标量是指仅有大小的量,如0,1,2……自然数。而矢量是指既有大小又有方向的量,通常用字母加箭头表示,如下图
2.矢量的运算
加减运算遵循平行四边形(三角形)法则
乘法运算有两种
1.向量点乘
2.向量叉乘
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)