结果图:
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef char ElType;
typedef int Status;
typedef struct StackNode{
ElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
void InitStack(LinkStack &s){
s=NULL;
}
bool StackEmpty(LinkStack &s){
return (s==NULL);
}
Status PushStack(LinkStack &s,ElemType e){ //数字栈入栈
LinkStack p=(LinkStack)malloc(sizeof(StackNode));
p->data=e;
p->next=s;
s=p;
return OK;
}
Status PopStack(LinkStack &s,ElemType *e){
if(StackEmpty(s))
return ERROR;
LinkStack p=s;
*e=p->data;
s=s->next;
free(p);
return OK;
}
//字母栈
typedef struct StackNode_zm{
ElType data;
struct StackNode_zm *next;
}StackNode_zm,*LinkStack_zm;
void InitStack_zm(LinkStack_zm &s){
s=NULL;
}
bool StackEmpty_zm(LinkStack_zm &s){
return (s==NULL);
}
Status GetStack_zm(LinkStack_zm s,ElType *e){
if(s==NULL)
return ERROR;
*e=s->data;
return OK;
}
Status PushStack_zm(LinkStack_zm &s,ElType e){ //字母栈入栈
LinkStack_zm p=(LinkStack_zm)malloc(sizeof(StackNode_zm));
p->data=e;
p->next=s;
s=p;
return OK;
}
Status PopStack_zm(LinkStack_zm &s,ElType *e){
if(StackEmpty_zm(s))
return ERROR;
LinkStack_zm p=s;
*e=p->data;
s=s->next;
free(p);
return OK;
}
Status isdigit(char a){
if(0<=(a-'0')&&(a-'0')<=9)
return OK;
else
return ERROR;
}
ElemType Operate(ElemType x,char c,ElemType y){
int result;
switch(c){
case '+':
result=x+y;
break;
case '-':
result=x-y;
break;
case '*':
result=x*y;
break;
case '/':
result=x/y;
break;
}
return result;
}
ElemType postfix(char c[]){ //后缀求值
LinkStack ss;
InitStack(ss);
int i=0;
ElemType a,b,result;
while(c[i]!='#'){
if(isdigit(c[i]))
PushStack(ss,(c[i]-'0'));
else{
PopStack(ss,&b);
PopStack(ss,&a);
result =Operate(a,c[i],b);
PushStack(ss, result);
}
i++;
}
PopStack(ss,&result);
return result;
}
int cmpStack_zm(char a,char b){ //符号比较
switch(a){
case '+':
switch (b){
case '+':
return 1;
case '-':
return 1;
case '*':
return -1;
case '/':
return -1;
case '(':
return -1;
case ')':
return 1;
case '#':
return 1;
}
break;
case '-':
switch (b){
case '+':
return 1;
case '-':
return 1;
case '*':
return -1;
case '/':
return -1;
case '(':
return -1;
case ')':
return 1;
case '#':
return 1;
}
break;
case '*':
switch (b){
case '+':
return 1;
case '-':
return 1;
case '*':
return 1;
case '/':
return 1;
case '(':
return -1;
case ')':
return 1;
case '#':
return 1;
}
break;
case '/':
switch (b){
case '+':
return 1;
case '-':
return 1;
case '*':
return 1;
case '/':
return 1;
case '(':
return -1;
case ')':
return 1;
case '#':
return 1;
}
break;
case '(':
switch (b){
case '+':
return -1;
case '-':
return -1;
case '*':
return -1;
case '/':
return -1;
case '(':
return -1;
case ')':
return 0;
}
break;
case ')':
switch (b){
case '+':
return 1;
case '-':
return 1;
case '*':
return 1;
case '/':
return 1;
case ')':
return 1;
case '#':
return 1;
}
break;
case '#':
switch (b){
case '+':
return -1;
case '-':
return -1;
case '*':
return -1;
case '/':
return -1;
case '(':
return -1;
case '#':
return 0;
}
break;
}
exit(0);
}
void main()
{
//char a[]={'8' , '3' , '5', '+' , '5' , '6' , '2' , '/' , '-' , '*' , '-' , '#'};
//char a[]={'3','5','2','-','*','#'};
//printf("%d\n",popfix(a));
LinkStack_zm l;
InitStack_zm(l);
char IPX[]={'8','-','(','3','+','5',')','*','(','5','-','6','/','2',')','#'};
char PFX[20];
int i=0,j=0;
ElType c,t;
while(IPX[i]){
c=IPX[i];
if(c=='#')
{
while(!StackEmpty_zm(l)){
PopStack_zm(l,&t);
PFX[j++]=t;
}
break;
}
switch(c){
case '(':
PushStack_zm(l,c);
break;
case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':
PFX[j++]=c;
break;
case '+':case '-':case '*':case '/':
GetStack_zm(l,&t);
if(StackEmpty_zm(l)||cmpStack_zm(t,c)<0)
PushStack_zm(l,c);
else{
while(cmpStack_zm(t,c)>=0)
{
PopStack_zm(l,&t);
PFX[j++]=t;
GetStack_zm(l,&t);
}
PushStack_zm(l,c);
}
break;
case ')':
GetStack_zm(l,&t);
while(t!='('){
PopStack_zm(l,&t);
PFX[j++]=t;
GetStack_zm(l,&t);
}
PopStack_zm(l,&t);
break;
}
i++;
}
PFX[j++]='#';
PFX[j]='\0';
i=0;
while(PFX[i])
{
printf("%c",PFX[i]);
i++;
}
printf("\n%d\n",postfix(PFX));
}