单链表解决四则运算的代码
时间: 2024-02-28 12:55:25 浏览: 23
以下是使用单链表解决四则运算的C++代码示例:
```c++
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
// 定义单链表节点结构体
struct Node {
char value; // 存储操作数或操作符
Node* next; // 指向下一个节点
};
// 将中缀表达式转换为后缀表达式
string infixToPostfix(string infix) {
string postfix = ""; // 存储后缀表达式
stack<char> s; // 存储操作符的栈
for (int i = 0; i < infix.length(); i++) {
char c = infix[i];
if (isdigit(c)) { // 操作数直接输出
postfix += c;
} else if (c == '(') { // 左括号入栈
s.push(c);
} else if (c == ')') { // 右括号将栈中操作符输出直到遇到左括号
while (!s.empty() && s.top() != '(') {
postfix += s.top();
s.pop();
}
s.pop(); // 弹出左括号
} else { // 操作符
while (!s.empty() && s.top() != '(' && ((c == '*' || c == '/') && (s.top() == '+' || s.top() == '-'))) {
postfix += s.top();
s.pop();
}
s.push(c);
}
}
while (!s.empty()) { // 将栈中剩余的操作符输出
postfix += s.top();
s.pop();
}
return postfix;
}
// 计算后缀表达式
int calculate(string postfix) {
Node* head = nullptr; // 链表头节点
Node* tail = nullptr; // 链表尾节点
for (int i = 0; i < postfix.length(); i++) {
char c = postfix[i];
if (isdigit(c)) { // 操作数创建新节点插入链表尾部
Node* node = new Node;
node->value = c;
node->next = nullptr;
if (tail == nullptr) {
head = tail = node;
} else {
tail->next = node;
tail = node;
}
} else { // 操作符弹出两个操作数计算,并将计算结果插入链表尾部
Node* node1 = tail;
tail = tail->next;
Node* node2 = tail;
tail = tail->next;
int val1 = node1->value - '0';
int val2 = node2->value - '0';
int result;
switch (c) {
case '+':
result = val2 + val1;
break;
case '-':
result = val2 - val1;
break;
case '*':
result = val2 * val1;
break;
case '/':
result = val2 / val1;
break;
}
Node* node = new Node;
node->value = result + '0';
node->next = nullptr;
if (tail == nullptr) {
head = tail = node;
} else {
tail->next = node;
tail = node;
}
}
}
int result = head->value - '0';
delete head;
return result;
}
int main() {
string infix = "3*(2+5)-6/(1+2)";
string postfix = infixToPostfix(infix);
cout << "后缀表达式:" << postfix << endl;
int result = calculate(postfix);
cout << "计算结果:" << result << endl;
return 0;
}
```
注意,这里的代码只能处理整数四则运算,如果需要处理小数或者更复杂的表达式,需要对代码进行修改。同时,由于单链表的插入和删除操作比较耗时,实际应用中可能需要使用其他数据结构,比如双向链表或者树来实现。