习题3.11 表达式转换 (25 分)
第一次写,就当记录一下自己的学习路程 新手上路如有雷同,纯属借鉴
#include<stdio.h>
#include<stdlib.h>
typedef struct SNode *PtrToSNode;
struct SNode{
char *Data;
int top;
int MAXSIZE;
};
typedef PtrToSNode Stack;
Stack CraetStack()
{
Stack S=(Stack)malloc(sizeof(struct SNode));
S->Data=(char *)malloc(21*sizeof(char));
S->top=-1;
S->MAXSIZE=21;
return S;
}
void Push(Stack S,char x){
S->top++;
S->Data[S->top]=x;
}
char Pop(Stack S){
return S->Data[S->top--];
}
int main()
{
int i=0,flag=1;
char c;
char a[40]; //表达式不超20字符,但加上数字就不超40了
Stack S=CraetStack();
while((a[i++]=getchar())!='\n');
a[i]='\0';
i=0;
while(a[i]!='\0'){
if(a[i]>='0'&&a[i]<='9'){ //数字
if(flag==1) printf("%c",a[i]);
else{
printf(" %c",a[i]);
flag=1;
}
}
else if(a[i]=='.'){ //小数
printf("%c",a[i]);
i++;
while(a[i]>='0'&&a[i]<='9'){
printf("%c",a[i]);
i++;
}
i--;
}
else if(a[i]=='+'){ //+
if(i==0);
else{
if(S->top!=-1&&S->Data[S->top]!='('){
while(S->top!=-1&&S->Data[S->top]!='('){
c=Pop(S);
printf(" %c",c);
}
}
Push(S,a[i]);
flag=0;
}
}
else if(a[i]=='-'){ //-
if(i==0)printf("%c",a[i]);
else{
if(S->top!=-1&&S->Data[S->top]!='('){
while(S->top!=-1&&S->Data[S->top]!='('){
c=Pop(S);
printf(" %c",c);
}
}
Push(S,a[i]);
flag=0;
}
}
else if(a[i]=='*'){ //*
if(S->top != -1 && (S->Data[S->top] == '*' || S->Data[S->top] == '/')){
while(S->top != -1 && (S->Data[S->top] == '*' || S->Data[S->top] == '/')){
c=Pop(S);
printf(" %c",c);
}
}
Push(S,a[i]);
flag=0;
}
else if(a[i]=='/'){ // /
if(S->top != -1 && (S->Data[S->top] == '*' || S->Data[S->top] == '/')){
while(S->top != -1 && (S->Data[S->top] == '*' || S->Data[S->top] == '/')){
c=Pop(S);
printf(" %c",c);
}
}
Push(S,a[i]);
flag=0;
}
else if(a[i]=='('){ //(
Push(S,a[i]);
if(a[i+1]=='+') i++;
else if(a[i+1]=='-'){
printf(" -");
flag=1;
i++;
}
}
else if(a[i]==')'){ //)
while(S->Data[S->top]!='('){
c=Pop(S);
printf(" %c",c);
}
c=Pop(S);
}
i++;
}
if(S->top!=-1){ //剩余堆栈元素的挤出
while(S->top!=-1){
c=Pop(S);
printf(" %c",c);
}
}
return 0;
}
如果有帮忙到你,点个赞再走把