本次完成了含有一个未知数的计算,还修复了好多bug(比如计算负数时报错)
点击查看代码
#include<iostream>
#include<string>
using namespace std;
// 链栈的存储结构
typedef struct StackNode
{
string date;
struct StackNode* next;
} StackNode, * LinkStack;
// 链栈的初始化
int InitStack(LinkStack& S)
{
S = NULL; //将栈顶指针置空
return 1;
}
int Push(LinkStack& S, string e) {
LinkStack p;
p = new StackNode;
if (!p)
exit(0);
p->date = e;
p->next = S;
S = p;
return 0;
}
//出栈
int Pop(LinkStack& S, string& e) {
LinkStack p;
p = new StackNode;
if (S == NULL)
return 1;
e = S->date;
p = S;
S = S->next;
delete p;
return 0;
}
int Linklength(LinkStack S)
{
int num = 0;
LinkStack q = S;
while (q) {
num++;
q = q->next;
}
return num;
}
void countAB(string num1, string num2, int& A, int& B, int& num_2) {
//Ax+B
int i;
num_2 = atoi(num2.c_str());
char num1_1[1000];
strcpy(num1_1, num1.c_str());
int len = strlen(num1_1);
for (i = 0; i < len; i++) {
if (num1_1[i] == 'x') {
break;
}
}
if (i == 0) {
A = 1;
}
if (i == len - 1) {
B = 0;
}
if (i != 0 || i != len - 1) {
if (num1_1[0] == '-' && i == 1) {
A = -1;
}
else if (num1_1[0] == '-' && i != 1) {
int j = 1;
char* A1 = &num1_1[j];
while (true)
{
if (num1_1[j + 1] >= '0' && num1_1[j + 1] <= '9') {
A1 = strcat(A1, &num1_1[j + 1]);
j++;
}
else
{
break;
}
}
A = atoi(A1);
A = -A;
}
else {
int j = 0;
string A1(1, num1_1[j]);
while (true)
{
if (j < len && num1_1[j + 1] >= '0' && num1_1[j + 1] <= '9') {
string A2(1, num1_1[j + 1]);
A1 = A1 + A2;
j++;
}
else
{
break;
}
}
A = atoi(A1.c_str());
}
//计算出B
int j = i + 2;
char* B1 = &num1_1[j];
while (true)
{
if (num1_1[j + 1] >= '0' && num1_1[j + 1] <= '9') {
B1 = strcat(B1, &num1_1[j + 1]);
j++;
}
else
{
break;
}
}
B = atoi(B1);
if (num1_1[i + 1] == '-') {
B = -B;
}
if (num1_1[0] == 'x') {
A = 1;
}
if (num1_1[len - 1] == 'x') {
B = 0;
}
}
}
string wuX(string num1, string num2, string oper) {
int num_1, num_2, mid1;
string mid;
num_1 = atoi(num1.c_str());
num_2 = atoi(num2.c_str());
//开始计算最优先的lisp子表达式
if (oper.compare("+") == 0) {
mid1 = num_1 + num_2;
mid = to_string(mid1);
}
else if (oper.compare("-") == 0) {
mid1 = num_2 - num_1;
mid = to_string(mid1);
}
else if (oper.compare("*") == 0) {
mid1 = num_1 * num_2;
mid = to_string(mid1);
}
else if (oper.compare("/") == 0) {
mid1 = num_2 / num_1;
mid = to_string(mid1);
}
else
{
printf("表达式有误(不识别的运算符)");
return false;
}
return mid;
}
string youX(string num1, string num2, string oper) {
//Ax+B
string mid,A_1,B_1;
int A, B, num_2;
int i;
countAB(num1, num2, A, B, num_2);
//多项式计算
if (oper.compare("+") == 0) {
B = B + num_2;
A_1 = to_string(A);
B_1 = to_string(B);
if (A != 0 && B < 0) {
mid = A_1 + "x" + B_1;
if (A == 1) {
mid = "x" + B_1;
}
}
else if (A != 0 && B > 0) {
mid = A_1 + "x" + "+" + B_1;
if (A == 1) {
mid = "x+" + B_1;
}
}
else if (A != 0 && B == 0) {
mid = A_1 + "x";
if (A == 1) {
mid = "x";
}
}
else if (A == 0) {
mid = B_1;
}
}
//常数-含x
else if (oper.compare("-") == 0) {
B = num_2 - B;
A_1 = to_string(A);
B_1 = to_string(B);
if (A != 0 && B < 0) {
if (A > 0) {
mid = "-" + A_1 + "x" + B_1;
if (A == 1) {
mid = "x" + B_1;
}
}
else {
A_1 = to_string(-A);
mid = A_1 + "x" + B_1;
}
}
else if (A != 0 && B > 0) {
if (A > 0) {
mid = "-" + A_1 + "x" + "+" + B_1;
if (A == 1) {
mid = "x+" + B_1;
}
}
else {
A_1 = to_string(-A);
mid = A_1 + "x" + "+" + B_1;
}
}
else if (A != 0 && B == 0) {
if (A > 0) {
mid = "-" + A_1 + "x";
if (A == 1) {
mid = "x";
}
}
else {
A_1 = to_string(-A);
mid = A_1 + "x";
}
}
else if (A == 0) {
mid = B_1;
}
}
else if (oper.compare("*") == 0) {
A = A * num_2;
B = B * num_2;
A_1 = to_string(A);
B_1 = to_string(B);
if (A != 0 && B < 0) {
mid = A_1 + "x" + B_1;
if (A == 1) {
mid = "x" + B_1;
}
}
else if (A != 0 && B > 0) {
mid = A_1 + "x+" + B_1;
if (A == 1) {
mid = "x+" + B_1;
}
}
else if (A != 0 && B == 0) {
mid = A_1 + "x";
if (A == 1) {
mid = "x";
}
}
else if (A == 0) {
mid = B_1;
}
}
else if (oper.compare("/") == 0) {
printf("x的系数不为1,不能计算");
return false;
}
else
{
printf("表达式有误(不识别的运算符)");
return false;
}
return mid;
}
string chufa(string num1, string num2, string oper) {
//Ax+B
string mid, A_1, B_1;
double A1, B1;
int A, B, num_2;
countAB(num1, num2, A, B, num_2);
A1 = (double)A / (double)num_2;
B1 = (double)B / (double)num_2;
A_1 = to_string(A1);
B_1 = to_string(B1);
if (A != 0 && B < 0) {
mid = A_1 + "x" + B_1;
if (A == 1) {
mid = "x" + B_1;
}
}
else if (A != 0 && B > 0) {
mid = A_1 + "x+" + B_1;
if (A == 1) {
mid = "x+" + B_1;
}
}
else if (A != 0 && B == 0) {
mid = A_1 + "x";
if (A == 1) {
mid = "x";
}
}
else if (A == 0) {
mid = B_1;
}
return mid;
}
string jianfa(string num1, string num2, string oper) {
string mid, A_1, B_1;
int A, B, num_2;
countAB(num1, num2, A, B, num_2);
B = B - num_2;
A_1 = to_string(A);
B_1 = to_string(B);
if (A != 0 && B != 0) {
mid = A_1 + "x" + B_1;
if (A == 1) {
mid = "x" + B_1;
}
}
else if (A != 0 && B == 0) {
mid = A_1 + "x";
if (A == 1) {
mid = "x";
}
}
else if (A == 0) {
mid = B_1;
}
return mid;
}
int count(LinkStack &numStack, LinkStack& operStack, string &mid) {
int length1 = Linklength(numStack);
int length2 = Linklength(operStack);
string num1, num2, oper;
if (length1 <= 1 || length2 == 0) {
cout << "error" << endl;
}
else
{
Pop(numStack, num1);
Pop(numStack, num2);
Pop(operStack, oper);
if (num1.find("x") == string::npos && num2.find("x") == string::npos) {
mid = wuX(num1, num2, oper);
}
if (num2.find("x") != string::npos && num1.find("x") == string::npos) {
if (oper.compare("/") == 0) {
//前一个数有x
mid = chufa(num2, num1, oper);
}
else if (oper.compare("-") == 0) {
//前一个数有x
mid = jianfa(num2, num1, oper);
}
else
{
mid = youX(num2, num1, oper);
}
}
if (num1.find("x") != string::npos && num2.find("x") == string::npos) {
mid = youX(num1, num2, oper);
}
}
}
int main() {
LinkStack numStack, operStack;
InitStack(numStack);
InitStack(operStack);
string mid;
char str[200];
gets_s(str);
if (str[0] == '0') {
exit(0);
}
int length = strlen(str);
int flag = 0;//0表示正,1表示负
for (int i = 0; i < length; i++) {
if (str[length - 1] != ')') {
cout << "error" << endl;
break;
}
if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/')
{
string str(1, str[i]);
Push(operStack, str);
}
else if (str[i] == '(' || str[i] == ',')
{
if (str[i + 1] == '-' && str[i + 2] != '(') {
i++;
flag = 1;
}
}
else if (str[i] == ')')
{
count(numStack, operStack, mid);
int length1 = Linklength(numStack);
int length2 = Linklength(operStack);
if (length1 <= 1 && length2 == 0) {
cout << mid << endl;
}
else if (i == length - 1) {
cout << "error" << endl;
break;
}
else {
Push(numStack, mid);
}
}
else if (str[i] >= '0' && str[i] <= '9') {
string str1(1, str[i]);
while (true)
{
if (str[i + 1] >= '0' && str[i + 1] <= '9') {
string str2(1, str[i + 1]);
str1 = str1 + str2;
i++;
}
else
{
break;
}
}
if (flag == 1) {
str1 = "-" + str1;
flag = 0;
}
Push(numStack, str1);
}
else if (str[i] == 'x') {
string str1(1, str[i]);
int j = i;
while (true)
{
if (str[j - 1] != ',' && str[j - 1] != '(') {
string str2(1, str[j - 1]);
str1 = str2 + str1;
j--;
}
else
{
break;
}
}
while (true)
{
if (str[i + 1] != ',' && str[i + 1] != ')') {
string str2(1, str[i + 1]);
str1 = str1 + str2;
i++;
}
else
{
break;
}
}
if (flag == 1) {
str1 = "-" + str1;
flag = 0;
}
Push(numStack, str1);
}
else
{
cout << "error" << endl;
break;
}
}
}