```cpp
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<map>
#include<string>
using namespace std;
struct Data
{
char sym;
};
struct Stack
{
Data data;
Stack* next;
};
bool pop_stack(Data data, Stack** Top)
{
if (*Top)
{
Stack* temp = (Stack*)malloc(sizeof(Stack));
temp->data = data;
temp->next = (*Top)->next;
(*Top)->next = temp;
}
else
{
*Top = (Stack*)malloc(sizeof(Stack));
(*Top)->next = NULL;
Stack* temp = (Stack*)malloc(sizeof(Stack));
temp->data = data;
temp->next = (*Top)->next;
(*Top)->next = temp;
}
return 1;
}
bool isEmpty(Stack* Top)
{
if (Top->next == NULL)
{
return 1;
}
else
{
return 0;
}
}
Data push_stack(Stack* Top)
{
if (isEmpty(Top))
{
Data d;
d.sym = '0';
return d;
}
else
{
Stack* now = Top->next;
Top->next = now->next;
Stack temp = *now;
free(now);
return temp.data;
}
}
Data* top_stack(Stack* Top)
{
if (isEmpty(Top))
{
return NULL;
}
else
{
return &Top->next->data;
}
}
const int MAXN = 10000;
int main()
{
Stack* Top = (Stack*)malloc(sizeof(Stack));
Top->next = NULL;
map<char, int> priority;
//标记运算符优先级
priority['0'] = 0;
priority['+'] = 1;
priority['-'] = 1;
priority['*'] = 2;
priority['/'] = 2;
char expression[MAXN] = { 0 };
char num[MAXN] = { 0 };//后缀表达式输出
printf( "请输入表达式:\n" );
scanf("%s", expression);
int len = strlen(expression);
int ct = 0;
int flag = 0;//标记是否遇到了括号
for (int i = 0; i <= len - 1; i++)
{
if (expression[i] >= '0' && expression[i] <= '9')
{
num[ct] = expression[i];
ct++;
}
else
{
//如果栈顶有确切的运算符,返回该运算符,否则返回'0'
char top_sym = (top_stack(Top))?(top_stack(Top)->sym):('0');
//把左括号压入栈
if (expression[i] == '(')
{
Data temp;
temp.sym = expression[i];
pop_stack(temp, &Top);
}
//把左右括号里面的东西都输出
else if (expression[i] == ')')
{
while (top_sym != '(')
{
num[ct] = push_stack(Top).sym;
ct++;
top_sym = (top_stack(Top)) ? (top_stack(Top)->sym) : ('0');
}
//删除左括号
push_stack(Top).sym;
}
else
{
//栈顶优先级大于等于输入优先级
if (priority[top_sym] >= priority[expression[i]]&&top_sym!='(')
{
//栈顶元素弹出,直到栈的元素优先级小于输入优先级,或者直到遇到了左括号
while (priority[top_sym] >= priority[expression[i]]&&top_sym!='(')
{
num[ct] = push_stack(Top).sym;
ct++;
top_sym = (top_stack(Top)) ? (top_stack(Top)->sym) : ('0');
}
//再把运算符压入栈
Data temp;
temp.sym = expression[i];
pop_stack(temp, &Top);
}
//把运算符压入栈
else
{
Data temp;
temp.sym = expression[i];
pop_stack(temp, &Top);
}
}
}
}
//将剩余运算符出栈
while (top_stack(Top))
{
num[ct] = push_stack(Top).sym;
ct++;
}
printf("%s\n", num);
}