編制演算法
⑴ 請用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 程序中的大括弧是否正確匹配。
請注意,這只是一個示例演算法,可能還有其他方法可以解決此問題。您可以嘗試不同的方法來找到最適合您的解決方案。