1.('('!=c1)&&(')'==c2)之后
2.('('==c1)&&(')'==c2)之后
3.('('==c1)||('('==c2) 之后
4.('*'==c1)||('/'==c1)之后
5.('*'==c2)||('/'==c2)之后
6.最后只剩下一种情况,结果
代码实现:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
typedef struct NODE{//结点类型
char c;
struct NODE* next;
}NODE;
typedef struct plstack{//栈指针类型
struct NODE* top;
}plstack;
plstack* CreateStack(){//栈的创建
plstack* ptr1;
ptr1=(plstack*)malloc(sizeof(plstack));
if(ptr1!=NULL){
ptr1->top=NULL;
}
else{
printf("Out of place!\n");
}
return ptr1;
}
int IsEmptyStack(plstack* ptr1){//判断栈是否为空
if(NULL==ptr1->top){
return 1;
}
else{
return 0;
}
}
void PushStack(plstack* ptr1,char c1){//压栈操作
NODE* p;
p=(NODE*)malloc(sizeof(NODE));
if(NULL==p){
printf("Out of space!\n");
}
else{
p->c=c1;
p->next=ptr1->top;
ptr1->top=p;
}
}
char PopStack(plstack* ptr1){//出栈并返回栈顶元素的值
int flag=IsEmptyStack(ptr1);
if(1==flag){
printf("Empty stack can not be popped!\n");
return 0;
}
else{
NODE* temp=ptr1->top;
ptr1->top=ptr1->top->next;
char c2;
c2=temp->c;
free(temp);
return c2;
}
}
char GetStack(plstack* ptr1){//不出栈并返回栈顶元素的值
int flag;
flag=IsEmptyStack(ptr1);
if(1==flag){
printf("Empty Stack has not top value!\n");
return 0;
}
else{
char c3;
c3=ptr1->top->c;
return c3;
}
}
void Function(plstack* p_optr,char *sptr1,char *sptr2){
for(;*sptr1!='\0';sptr1++){
switch(*sptr1){
case '\n':break;
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':{
if(p_optr->top==NULL){
PushStack(p_optr,*sptr1);break;
}
char c1=p_optr->top->c;
char c2=*sptr1;
if(('('!=c1)&&(')'==c2)){
for(;('('!=c1)&&(')'==c2);){
*sptr2=PopStack(p_optr);sptr2++;
c1=p_optr->top->c;
}
sptr1--;
}
else if(('('==c1)&&(')'==c2)){
PopStack(p_optr);
}
else if(('('==c1)||('('==c2)){
PushStack(p_optr,*sptr1);
}
else if(('*'==c1)||('/'==c1)){
*sptr2=PopStack(p_optr);sptr2++;
sptr1--;
}
else if(('*'==c2)||('/'==c2)){
PushStack(p_optr,*sptr1);
}
else{
*sptr2=PopStack(p_optr);sptr2++;
sptr1--;
}
break;
}
default:*sptr2=*sptr1;sptr2++;
}
}
while(p_optr->top!=NULL){
*sptr2=PopStack(p_optr);sptr2++;
}
}
int main()
{
char s1[100];
char *sptr1=s1;
fgets(sptr1,60,stdin);
//创建 “运算符”栈
plstack* p_optr=CreateStack();
//后缀表示式放在s2中
char s2[100]={0};
char *sptr2=s2;
Function(p_optr,sptr1,sptr2);
printf("%s",s2);
return 0;
}