1.源代码
#include<malloc.h>
#include<stdio.h>
#include<string.h>
int KKK=1; //定义全局变量用于判断
typedef struct StackNode//链表结构体1
{
char data;
struct StackNode *next;
}StackNode,*LinkStackPtr;
typedef struct Stack//链表结构体2
{
int data;
struct Stack *next;
}Stack,*Link;
typedef struct//栈顶结构体1
{
LinkStackPtr top;
int count;
}LinkStack,*Sptr;
typedef struct//栈顶结构体2
{
Link top;
int cout;
}LinkA,*Spt;
Sptr InitList1()//分配运算符的栈的初始化1
{
Sptr head=(Sptr)malloc(sizeof(LinkStack));
head->count=0;
LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
s->data='#';
head->top=s;
return head;
}
Sptr InitList2()//栈的初始化2
{
Sptr head=(Sptr)malloc(sizeof(LinkStack));
head->count=0;
head->top=NULL;
return head;
}
Spt InitList3()//栈的初始化3
{
Spt head=(Spt)malloc(sizeof(LinkA));
head->cout=0;
head->top=NULL;
return head;
}
void Push(Sptr S,char e)//添加栈顶元素 1
{
LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
s->data=e;
s->next=S->top;
S->top=s;
S->count++;
}
void Push2(Spt S,char e)//添加栈顶元素2
{
Link s=(Link)malloc(sizeof(Stack));
s->data=(int)e-48;
s->next=S->top;
S->top=s;
S->cout++;
}
int Pop1(Sptr S)//删除栈顶元素1
{
LinkStackPtr p;
if(S->top==NULL){printf("stack is empty\n");return 0;}
else{
p=S->top;
S->top=p->next;
free(p);
S->count--;
}
}
int Pop2(Sptr S,char *A)//删除栈顶元素同时提取栈顶元素
{
LinkStackPtr p;
if(S->top==NULL){printf("stack is empty\n");return 0;}
else{
p=S->top;
S->top=p->next;
*A=p->data;
free(p);
S->count--;
}
}
int Pop3(Spt S)//删除栈顶元素2
{
Link p;
if(S->top==NULL){printf("stack is empty\n");return 0;}
else{
p=S->top;
S->top=p->next;
free(p);
S->cout--;
}
}
int deal(char sss[])
{
int S1=0,T=0,A=1;
int l=strlen(sss);
for(int i=0;i<l;i++)
{
if(sss[i]=='(')
S1++;
if(sss[i]==')')
{
if(S1!=0)
S1--;
else
T++;
}
}
for(int i=0;i<l;i++)
{
if(sss[i]!='+'&&sss[i]!='-'&&sss[i]!='*'&&sss[i]!='/'&&sss[i]!='('&&sss[i]!=')')
{
if(sss[i]>'9'||sss[i]<'0')
{
A=0;
}
}
}
for(int i=0;i<l-1;i++)
{
if(sss[i+1]!='+'&&sss[i+1]!='-'&&sss[i+1]!='*'&&sss[i+1]!='/'&&sss[i+1]!='('&&sss[i+1]!=')')
{
if((sss[i]>='0'&&sss[i]<='9')&&(sss[i+1]>='0'&&sss[i+1]<='9'))
{
A=0;
}
}
}
if(S1==0&&T==0)
{}
else
{
A=0;
}
for(int i=0;i<l-1;i++)
{
if(sss[0]=='+'||sss[0]=='-'||sss[0]=='*'||sss[0]=='/')
{
A=0;
}
if((sss[i]=='+'||sss[i]=='-'||sss[i]=='*'||sss[i]=='/')&&(sss[i+1]=='+'||sss[i+1]=='-'||sss[i+1]=='*'||sss[i+1]=='/'))
{
A=0;
}
}
return A;
}
Sptr invert1(char sss[])//中缀表达式转化为后缀表达式
{
Sptr S1=InitList1();//分配运算符的栈
Sptr S2=InitList2();//分配数的栈
char A;//定义的全局变量,用于两个栈元素之间的转移
int l=strlen(sss);
for(int i=0;i<l;i++)
{
if(sss[i]>='0'&&sss[i]<='9')
{
Push(S2,sss[i]);//数字入栈
}
else
if(sss[i]=='+'||sss[i]=='-'||sss[i]=='*'||sss[i]=='/')
{
if(S1->top->data=='#')
{
Push(S1,sss[i]);//运算符入栈
}
else
{
if((S1->top->data=='*'||S1->top->data=='/')&&(sss[i]=='+'||sss[i]=='-'))
{
while(S1->top->data!='#'&&S1->top->data!='(')
{
Pop2(S1,&A);
Push(S2,A);
}
Push(S1,sss[i]);
}
else
if((S1->top->data=='*'||S1->top->data=='/')&&(sss[i]=='*'||sss[i]=='/'))
{
while(S1->top->data!='#'&&S1->top->data!='(')
{
if(S1->top->data=='*'||S1->top->data=='/')
{
Pop2(S1,&A);
Push(S2,A);
}
else
{
break;
}
}
Push(S1,sss[i]);
}
else
if((S1->top->data=='+'||S1->top->data=='-')&&(sss[i]=='*'||sss[i]=='/'))
{
Push(S1,sss[i]);
}
else
if((S1->top->data=='+'||S1->top->data=='-')&&(sss[i]=='+'||sss[i]=='-'))
{
while(S1->top->data!='#'&&S1->top->data!='(')
{
Pop2(S1,&A);
Push(S2,A);
}
Push(S1,sss[i]);
}
else
if(S1->top->data=='(')
{
Push(S1,sss[i]);
}
}
}
else
if(sss[i]=='(')
{
Push(S1,sss[i]);
}
else
if(sss[i]==')')
{
while(S1->top->data!='(')
{
Pop2(S1,&A);
Push(S2,A);
}
Pop1(S1);
}
}
while(S1->top->data!='#')//表达式录入结束后将S1中剩余的运算符转移到S2中
{
Pop2(S1,&A);
Push(S2,A);
}
return S2;
}
Sptr invert2(Sptr S1)//将栈中的元素倒置
{
Sptr S2=InitList2();
char A;//定义的全局变量,用于两个栈元素之间的转移
while(S1->top!=NULL)
{
Pop2(S1,&A);
Push(S2,A);
}
return S2;
}
Spt operation(Sptr S1)
{
Spt S2=InitList3();
char A;//定义的全局变量,用于两个栈元素之间的转移
int B;//定义的全局变量,用于两个栈元素之间的转移
while(S1->top!=NULL)
{
if(S1->top->data!='+'&&S1->top->data!='-'&&S1->top->data!='*'&&S1->top->data!='/')
{
Pop2(S1,&A);
Push2(S2,A);
}
else
{
if(S1->top->data=='+')
{
Pop2(S1,&A);//移除符号位
B=S2->top->next->data+S2->top->data;
Pop3(S2);
S2->top->data=B;
}
else
if(S1->top->data=='-')
{
Pop2(S1,&A);//移除符号位
B=S2->top->next->data-S2->top->data;
Pop3(S2);
S2->top->data=B;
}
else
if(S1->top->data=='*')
{
Pop2(S1,&A);//移除符号位
B=S2->top->next->data*S2->top->data;
Pop3(S2);
S2->top->data=B;
}
else
if(S1->top->data=='/')
{
Pop2(S1,&A);//移除符号位
if(S2->top->data!=0)
{
B=S2->top->next->data/S2->top->data;
Pop3(S2);
S2->top->data=B;
}
else
{
KKK=0;
break;
}
}
}
}
return S2;
}
void List(LinkA *L)//打印链表
{
Link p;
p=L->top;
printf("输出的值为:\n");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//打印链表
Sptr ZZZZ(LinkStack *L)
{
LinkStackPtr p;
p=L->top;
Sptr q=InitList2();
char A;
while(p!=NULL)
{
A=p->data;
Push(q,A);
p=p->next;
}
return q;
}
void List1(LinkStack *L)
{
LinkStackPtr p;
p=L->top;
printf("后缀表达式为:\n");
while(p!=NULL)
{
printf("%c ", p->data);
p=p->next;
}
printf("\n");
}
int main()//主函数
{
printf("(注意:输入的数字的范围为[0,9])\n");
printf("输入样例:(1+1)\n");
printf("请输入中缀表达式:");
char sss[1000];
gets(sss);
int A=deal(sss);
Sptr S1=invert1(sss);
S1=invert2(S1);
Sptr S=ZZZZ(S1);
S=invert2(S);
Spt S2=operation(S1);
if(A==1&&KKK==1)
{
printf("输入的中缀表达式合法\n");
List1(S);
List(S2);
}
else
{
printf("输入的中缀表达式不正确!");
}
}
2.运行过程