附带系统菜单的单链表解决四则运算
时间: 2024-02-28 14:55:30 浏览: 25
以下是带有系统菜单的单链表解决四则运算的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;
}
// 显示系统菜单
void showMenu() {
cout << "请选择要进行的操作:" << endl;
cout << "1. 输入中缀表达式" << endl;
cout << "2. 退出程序" << endl;
}
int main() {
string infix = "";
bool exitFlag = false;
while (!exitFlag) {
showMenu();
int choice;
cin >> choice;
switch (choice) {
case 1:
cout << "请输入中缀表达式:" << endl;
cin >> infix;
cout << "中缀表达式:" << infix << endl;
string postfix = infixToPostfix(infix);
cout << "后缀表达式:" << postfix << endl;
int result = calculate(postfix);
cout << "计算结果:" << result << endl;
break;
case 2:
exitFlag = true;
break;
default:
cout << "无效的选项,请重新输入!" << endl;
break;
}
}
return 0;
}
```
该程序在运行时会显示一个菜单,用户可以选择输入中缀表达式、退出程序等操作。当用户输入中缀表达式后,程序会将其转换为后缀表达式,并计算出结果。用户可以反复输入不同的表达式进行计算,直到选择退出程序为止。