#include<iostream>
#include<string>
using namespace std;
typedef char SElemType;
typedef struct node {
SElemType data;
struct node*link;
}LinkNode,*LinkStack;
void StackInit(LinkStack S)
{
S = NULL;
}
void Push(LinkStack&S,SElemType val)
{
LinkStack NewNode = new LinkNode;
NewNode->data = val;
NewNode->link = S;
S = NewNode;
}
int Pop(LinkStack&S, SElemType&x)
{
if (S == NULL)return 0;
x = S->data;
S = S->link;
}
SElemType GetTop(LinkStack&S)
{
if (S == NULL)return 0;
return S->data;
};
int isp(char c)
{
switch (c) {
case'#':return 0;
case'*':
case'/':
case'%':return 5;
case'(':return 1;
case'+':
case'-':return 3;
case')':return 6;
default:return -1;
}
}
int icp(char c)
{
switch (c) {
case'#':return 0;
case'*':
case'/':
case'%':return 4;
case'(':return 6;
case'+':
case'-':return 2;
case')':return 1;
default:return -1;
}
}
string InfixToPostfix(string S)
{
string SA;
char c;
LinkStack stack=NULL;
StackInit(stack);
for (int i = 0;i < S.size();i++)
{
if (S[i] >= '0'&&S[i] <= '9')
SA += S[i];
else
{
if (icp(S[i]) > isp(GetTop(stack)))
Push(stack,S[i]);
else {
while (isp(GetTop(stack)) >= icp(S[i]))
{
if (isp(GetTop(stack)) > icp(S[i]))
{
Pop(stack, c);
SA += c;
}
else Pop(stack, c);
}
Push(stack,S[i]);
}
}
}
while (stack != NULL)
{
Pop(stack, c);
SA += c;
}
return SA;
}
int main()
{
string S1 = "1+2-3+4+5";
string S2 = InfixToPostfix(S1);
cout << S1 << endl;
cout << S2 << endl;
getchar();
}
03-02
378
10-29
3480
05-05