#include <stdio.h>
#include <stdlib.h>
/**
* 带有头结点
*/
typedef struct Node *Stack;
struct Node{
char s;
Stack Next;
};
//操作
Stack CreateStack(); //初始化栈
void Push(Stack p,char str); //入栈
int IsEmpty(Stack p); //判断是不是为空
char Pop(Stack p); //出栈
char GetTop(Stack p); //得到栈顶元素
void majoy(Stack p,char *s); //后缀表达式,数字直接输出,若是符号则与栈顶相比若是栈顶大就输出,后入栈
int main()
{
Stack p = CreateStack();
char S[50] = {0};
scanf("%[^\n]",S);
majoy(p,S); //得到后缀表达式
system("pause");
return 0;
}
char Pop(Stack p)
{
Stack ptr;
char str;
if(IsEmpty(p)){
printf("栈空\n");
return '\0';
}
ptr = p->Next;
str = ptr->s;
p->Next = ptr->Next;
free(ptr);
return str;
}
int IsEmpty(Stack p)
{
return (p->Next == NULL);
}
char GetTop(Stack p)
{
if(IsEmpty(p)) return '\0';
else return p->Next->s;
}
void Push(Stack p,char str)
{
Stack ptr;
ptr = CreateStack();
ptr->s = str;
ptr->Next = p->Next; //注意指向的位置
p->Next = ptr;
}
Stack CreateStack()
{
Stack q;
q = (Stack)malloc(sizeof(struct Node));
q->s = '\0';
q->Next = NULL;
return q;
}
void majoy(Stack p,char *S)
{
int flag=0;
char *ptr=S;
while(*ptr)
{
//处理数字
if((*ptr>='0' && *ptr<='9')||*ptr=='.')
{
if(flag)printf(" ");
while((*ptr>='0' && *ptr<='9')||*ptr=='.'){
printf("%c",*ptr);
ptr++;
flag=1;
}
}
//处理-1这种情况
else if((*ptr=='+'||*ptr=='-')&&(ptr==S||*(ptr-1)=='('))
{
if(flag) printf(" ");
if(*ptr == '-') printf("-");
ptr++;
}
//处理左括号1
else if(*ptr=='(')
{
Push(p,*ptr);
ptr++;
}
//处理右括号
else if(*ptr==')')
{
while(GetTop(p) != '(')
{
printf(" %c",Pop(p));
}
Pop(p);
ptr++;
}
//处理加号
else if(*ptr=='+'||*ptr=='-')
{
//不一样
if(IsEmpty(p)||GetTop(p)=='(') Push(p,*ptr);
else
{
while(!IsEmpty(p)&&GetTop(p)!='(')
printf(" %c",Pop(p));
Push(p,*ptr);
}
ptr++;
}
//处理乘号
else if(*ptr=='*'||*ptr=='/')
{
if(IsEmpty(p)||GetTop(p)=='('||GetTop(p)=='+'||GetTop(p)=='-') Push(p,*ptr);
//else if(GetTop(p)=='+'||GetTop(p)=='-') Push(p,*ptr);
else
{
if(GetTop(p)=='*'||GetTop(p)=='/')
{
printf(" %c",Pop(p));
Push(p,*ptr);
}
}
ptr++;
}
}
while(!IsEmpty(p))
printf(" %c",Pop(p));
}
序号 输入 输出 说明
0 2+3*(7-4)+8/4 2 3 7 4 - * + 8 4 / + 正常测试6种运算符
1 ((2+3)*4-(8+2))/5 2 3 + 4 * 8 2 + - 5 / 嵌套括号
2 1314+25.5*12 1314 25.5 12 * + 运算数超过1位整数且有非整数出现
3 -2*(+3) -2 3 * 运算数前有正负号
4 123 123 只有一个数字