題目描述
lisp語言唯一的語法就是括號要配對。
形如 (op p1 p2 …),括號內元素由單個空格分割。
其中第乙個元素op為操作符,後續元素均為其引數,引數個數取決於操作符型別
注意:引數 p1, p2 也有可能是另外乙個巢狀的 (op p1 p2 …)
當前op型別為add/sub/mul/div(全小寫),分別代表整數的加減乘除法。簡單起見,所以op引數個數為2
舉例 -輸入:(mul 3 -7)輸出:-21
輸入:(add 1 2) 輸出:3
輸入:(sub (mul 2 4) (div 9 3)) 輸出 :5
輸入:(div 1 0) 輸出:error
主要思路:對輸入的字串進行預處理,拆分成'('、')'、運算元和操作符("add", "sub", "mul", "div"),隨後使用堆疊處理這些拆分後的字串。編譯器為vs(注:若使用gcc編譯器,pch = strtok_s(str, splitchar, &p);需要改為pch = strtok(str, splitchar);)**如下:
#include #include #include #include using namespace std;
void regeneratestring(const string &oldstr, string &newstr)
else
}}void split(char *str, char *splitchar, vector&strvec)
}void str2char(const string& str, char *pstr)
int main()
cmdstack.pop();
//operandnum = ;
if (operandnum[2] == "add")
cmdstack.push(to_string(atoi(operandnum[1].c_str()) + atoi(operandnum[0].c_str())));
else if (operandnum[2] == "sub")
cmdstack.push(to_string(atoi(operandnum[1].c_str()) - atoi(operandnum[0].c_str())));
else if (operandnum[2] == "mul")
cmdstack.push(to_string(atoi(operandnum[1].c_str()) * atoi(operandnum[0].c_str())));
else if (operandnum[2] == "div")
cmdstack.push(to_string(atoi(operandnum[1].c_str()) / atoi(operandnum[0].c_str())));}}
} if (flag == false)
cout << "error" << endl;
else
cout << cmdstack.top() << endl;
} return 0;
}
再次宣告:
在gcc下編譯(或oj)時,
pch = strtok_s(str, splitchar, &p);
需要改為
pch = strtok(str, splitchar);
此外還需要引入strtok的標頭檔案
#include
謝謝大家! 華為機試(仿LISP字串運算)
程式設計 300分 仿lisp字串運算 時間限制 3秒 空間限制 32768k 題目描述 lisp語言唯一的語法就是括號要配對。形如 op p1 p2 括號內元素由單個空格分割。其中第乙個元素op為操作符,後續元素均為其引數,引數個數取決於操作符型別 注意 引數 p1,p2 也有可能是另外乙個巢狀的...
2017華為機試(仿LISP字串運算)
程式設計 300分 仿lisp字串運算 題目描述 lisp語言唯一的語法就是括號要配對。形如 op p1 p2 括號內元素由單個空格分割。其中第乙個元素op為操作符,後續元素均為其引數,引數個數取決於操作符型別 注意 引數 p1,p2 也有可能是另外乙個巢狀的 op p1 p2 當前op型別為add...
2017華為機試(仿LISP字串運算)
程式設計 300分 仿lisp字串運算 題目描述 lisp語言唯一的語法就是括號要配對。形如 op p1 p2 括號內元素由單個空格分割。其中第乙個元素op為操作符,後續元素均為其引數,引數個數取決於操作符型別 注意 引數 p1,p2 也有可能是另外乙個巢狀的 op p1 p2 當前op型別為add...