中缀表达式:9+(3-1)*3+10/2
转化为后缀表达式:931-3*+102/+
规则:
从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或是优先级不高于栈顶符号则栈顶元素依次出栈并输出,并将当前符号进栈,直到最终输出后缀表达式为止。
代码是用最简单的逻辑写的,没有绕任何弯子,绝对可以看懂。我是新手,勿喷望指正。
代码 c++:VS2013 + WIN7
#include <iostream>
using namespace std;
#define ok 0
#define error -1
typedef int Elemtype;
typedef int status;//函数返回的状态,如ok error
typedef struct StackNode
{
Elemtype data;
struct StackNode *next;
}StackNode, *StackNodeP;
typedef struct LinkStack
{
StackNodeP top;
int count;
}LinkStack;
LinkStack* LinkStack_Create();//链栈的创建
status LinkStack_Clear(LinkStack* stack);//链栈的清空
int LinkStack_Isempty(LinkStack* stack);//链栈是否为空
status LinkStack_Push(LinkStack* stack, Elemtype e);//链栈的入栈
Elemtype LinkStack_Pop(LinkStack* stack);//链栈的出栈
int LinkStack_Length(LinkStack* stack);//链栈的长度
Elemtype LinkStack_Top(LinkStack* stack);//链栈的头部元素
status change(char* buf,char* afterbuf)
{
int i=0;
LinkStack* LS = LinkStack_Create();
/*
设定+ 1
- 2
* 3
/ 4
*/
while (*buf)
{
if ((*buf >= '0') && (*buf <= '9'))
{
while ((*buf >= '0') && (*buf <= '9'))
{
afterbuf[i] = *buf;
buf++;
i++;
}
afterbuf[i++] = ',';
}
if (*buf == '+')
{
if (LinkStack_Isempty(LS))//如果链栈为空,则直接将‘+’入栈
LinkStack_Push(LS, 1);
else if ( LinkStack_Top(LS)> 2)//如果链栈的头结点上为‘*’‘/’,则栈中所有都弹出
{
while (!LinkStack_Isempty(LS))//直到将栈中的所有都弹出
{
if (LinkStack_Top(LS) == -1)//如果为'('则停止循环
{
break;
}
else
{
switch (LinkStack_Top(LS))
{
case 1:
afterbuf[i++] = '+'; afterbuf[i++] = ','; break;
case 2:
afterbuf[i++] = '-'; afterbuf[i++] = ','; break;
case 3:
afterbuf[i++] = '*'; afterbuf[i++] = ','; break;
case 4:
afterbuf[i++] = '/'; afterbuf[i++] = ','; break;
}
}
LinkStack_Pop(LS);
}
LinkStack_Push(LS, 1);
}
else//如果链栈中也是‘+’‘-’则直接入栈
LinkStack_Push(LS, 1);
buf++;
}
if (*buf == '-')
{
if (LinkStack_Isempty(LS))//如果链栈为空,则直接将‘+’入栈
LinkStack_Push(LS, 2);
else if (LinkStack_Top(LS)> 2)//如果链栈的头结点上为‘*’‘/’,则栈中所有都弹出
{
while (!LinkStack_Isempty(LS))//直到将栈中的所有都弹出
{
if (LinkStack_Top(LS) == -1)//如果为'('则停止循环
{
break;
}
else
{
switch (LinkStack_Top(LS))
{
case 1:
afterbuf[i++] = '+'; afterbuf[i++] = ','; break;
case 2:
afterbuf[i++] = '-'; afterbuf[i++] = ','; break;
case 3:
afterbuf[i++] = '*'; afterbuf[i++] = ','; break;
case 4:
afterbuf[i++] = '/'; afterbuf[i++] = ','; break;
}
}
LinkStack_Pop(LS);
}
LinkStack_Push(LS, 2);
}
else//如果链栈中也是‘+’‘-’则直接入栈
LinkStack_Push(LS, 2);
buf++;
}
if (*buf == '*')//如果为'*'直接入栈
{
LinkStack_Push(LS, 3);
buf++;
}
if (*buf == '/')//如果为'/'直接入栈
{
LinkStack_Push(LS, 4);
buf++;
}
if (*buf == '(')//如果为左括号则直接进栈
{
LinkStack_Push(LS, -1);
buf++;
}
if (*buf == ')')//如果为右括号则出栈直到左括号
{
while (LinkStack_Top(LS) != -1)
{
switch (LinkStack_Top(LS))
{
case 1:
afterbuf[i++] = '+'; afterbuf[i++] = ','; break;
case 2:
afterbuf[i++] = '-'; afterbuf[i++] = ','; break;
case 3:
afterbuf[i++] = '*'; afterbuf[i++] = ','; break;
case 4:
afterbuf[i++] = '/'; afterbuf[i++] = ','; break;
}
LinkStack_Pop(LS);
}
LinkStack_Pop(LS);//最后把左括号给弹出来
buf++;
}
}
while (!LinkStack_Isempty(LS))
{
switch (LinkStack_Top(LS))
{
case 1:
afterbuf[i++] = '+'; afterbuf[i++] = ','; break;
case 2:
afterbuf[i++] = '-'; afterbuf[i++] = ','; break;
case 3:
afterbuf[i++] = '*'; afterbuf[i++] = ','; break;
case 4:
afterbuf[i++] = '/'; afterbuf[i++] = ','; break;
}
LinkStack_Pop(LS);
}
return NULL;
}
int main(void)
{
char* buf = (char*)malloc(sizeof(char));
char afterbuf[1024] = {0};
cin >> buf;
change(buf,afterbuf);//中缀表达式转后缀表达式
cout << afterbuf<<endl;
system("pause");
}
//链栈的创建
LinkStack* LinkStack_Create()
{
LinkStack* temp = NULL;
temp = (LinkStack*)malloc(sizeof(LinkStack));
if (temp == NULL)
cout << "LinkStack_create 出错"<< endl;
temp->count = 0;
temp->top= NULL;
return temp;
}
//链栈的清空
status LinkStack_Clear(LinkStack* stack)
{
if (stack == NULL)
return ok;
stack->top->next = NULL;
stack->count = 0;
return ok;
}
//链栈是否为空
int LinkStack_Isempty(LinkStack* stack)
{
if (stack == NULL)
return error;
return stack->top == NULL ? 1 : 0;
}
//链栈的长度
int LinkStack_Length(LinkStack* stack)
{
if (stack == NULL)
return error;
return stack->count;
}
//链栈的入栈
status LinkStack_Push(LinkStack* stack, Elemtype e)
{
if (stack == NULL)
return error;
LinkStack* temp = NULL;
temp = (LinkStack*)stack;
StackNodeP SNP = (StackNodeP)malloc(sizeof(StackNode));
SNP->data = e;
SNP->next = temp->top;
temp->top = SNP;
temp->count++;
return ok;
}
//链栈的出栈
Elemtype LinkStack_Pop(LinkStack* stack)
{
if (stack == NULL)
return error;
LinkStack* temp = NULL;
temp = (LinkStack*)stack;
Elemtype node = temp->top->data;//这是将要删除的元素缓存下来
StackNodeP p = temp->top;//将栈顶结点赋值给p
temp->top = temp->top->next;//栈顶指针下移一位,指向后一个结点
free(p);//释放结点
temp->count--;
return node;
}
//链栈的头部元素
Elemtype LinkStack_Top(LinkStack* stack)
{
if (stack == NULL)
return error;
return stack->top->data;
}
侧视图: