접미사를 접미사로 변환하고 접미사로 계산하기 위해 두 개의 소스 파일을 작성했고 나중에 그것들을 연결하여 계산기를 만들 생각을했습니다. 두 스택의 선언을 클래스 템플릿으로 결합 할 수 있지만 복사 및 붙여 넣기가 편리하기 때문에 수정이 없습니다. 하나는 배열 스택이고 다른 하나는 연결된 목록 스택입니다.
중위 변환 스택의 기능을 작성할 때 주로 여는 괄호 처리에서 몇 가지 문제가 발생했습니다. 원칙을 더 잘 이해할 수 있도록 테스트를 위해 몇 가지 중위 식을 작성하고자 할 수 있습니다.
간단히 말해서 두 모듈은 다음 아이디어로 그룹화 할 수 있습니다. (Luo Gu의 솔루션 참조)
#include<iostream>
#include<string>
#define MAX_N 10000
using namespace std;
class node{
public:
int data;
node *next;
};
//中缀转换栈
class Stack1{
public:
Stack1(){
top=-1;
ope= new char[MAX_N];
}
~Stack1(){
delete ope;
}
void Push(int data){
top= top+1;
ope[top]= data;
}
char Pop(){
int temp= top;
top= top-1;
return ope[temp];
}
char Top(){
return ope[top];
}
bool isEmpty(){
return top==-1;
}
private:
int top;
char *ope;
};
//后缀计算栈
class Stack2{
public:
Stack2(){
top= NULL;
}
~Stack2(){
while(top!=NULL){
node *ptr= top;
top= top->next;
delete ptr;
}
}
void Push(int data){
node *ptr= new node;
ptr->next= top;
ptr->data= data;
top= ptr;
}
int Pop(){
if(isEmpty()){
cout <<"Error Pop:STACK EMPTY" << endl;
return -1;
}
else{
int tempdata= top->data;
node *ptr= top;
top= top->next;
delete ptr;
return tempdata;
}
}
int Top(){
if(isEmpty()){
cout <<"Error Top:STACK EMPTY" << endl;
return -1;
}
else
return top->data;
}
bool isEmpty(){
return top== NULL;
}
private:
node *top;
};
//优先级判断函数
int judge(char temp){
if(temp=='+'||temp=='-'){
return 1;
}
if(temp=='*'||temp=='/'){
return 2;
}
if(temp=='(') return 0;
}
//中缀转后缀函数
string midfixToPostfix(string midfix){
string postfix;
Stack1 stk;
char curr;
for(int i=0; i<midfix.length(); i++){
curr= midfix[i];
//数字直接输出
if(curr>='0'&&curr<='9'){
postfix= postfix+ curr;
}
//左括号直接入栈
if(curr=='(') {
stk.Push('(');
}
//右括号弹出元素至左括号
if(curr==')'){
while(stk.Top()!='('){
postfix= postfix+ stk.Pop();
}
stk.Pop();
}
//其他符号比较栈顶优先级
if((curr<'0'||curr>'9')&&curr!='(' &&curr!=')'){
while(!stk.isEmpty()&&judge(curr)<=judge(stk.Top())){
postfix= postfix+ stk.Pop();
}
stk.Push(curr);
}
}
while(!stk.isEmpty()){
postfix= postfix+ stk.Pop();
}
return postfix;
}
//后缀计算函数
int calPostfix(string postfix){
Stack2 sta;
int i=0;
while(i<postfix.length()){
char curr=postfix[i];
if(curr>='0'&& curr<='9'){
sta.Push(curr-'0');
}
if(curr<'0'||curr>'9'){
int result= 0;
int numA= sta.Pop();
int numB= sta.Pop();
switch(curr){
case '+':
result= numA+numB;
break;
case '-':
result= numB-numA;
break;
case '*':
result= numA*numB;
break;
case '/':
result= numB/numA;
break;
default:
break;
}
sta.Push(result);
}
i=i+1;
}
return sta.Top();
}
//函数接口
int calculate(string midfix){
string postfix;
int result;
postfix= midfixToPostfix(midfix);
result= calPostfix(postfix);
return result;
}
string input;
int main(){
cin >> input;
//cout << midfixToPostfix(input)<< endl;
cout << calculate(input)<< endl;
return 0;
}