编制算法
⑴ 请用C++编写一个算法,完成矢量的加法与成法运算,运算规则如下:
#include <cstdlib>
#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<<z;ss>>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=0;i<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;
}
}
}
⑵ 试编写一个算法从检查一个Java语言中的大括号方括号小括号是否配对,若能够全
要编写用于检查 Java 程序中的大括号、方括号和圆括号是否正确匹配的算法,可以使用堆栈数据结构来跟踪代码中遇到的左大括号。例如,您可以使用以下步骤:
初始化空堆栈。
循环遍历 Java 程序中的字符,从第一个字符开始。
如果当前字符是左大括号(即、、或),则将其推送到堆栈上。{[(
如果当前字符是右大括号(即、或),则从堆栈中弹出顶部元素。如果弹出的元素与当前右大括号不匹配,则返回(指示大括号未正确匹配)。}])False
重复步骤 3 和 4,直到到达 Java 程序的末尾。
如果堆栈为空,则返回(指示大括号正确匹配)。否则,返回(表示大括号未正确匹配)。TrueFalse
此算法使用堆栈来跟踪 Java 程序中遇到的左大括号,并通过将右大括号与从堆栈中弹出的相应左大括号进行比较来检查是否匹配。此方法可以处理大括号的任意嵌套结构,并将正确识别 Java 程序中的大括号是否正确匹配。
请注意,这只是一个示例算法,可能还有其他方法可以解决此问题。您可以尝试不同的方法来找到最适合您的解决方案。