表达式转换

#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                              只有一个数字
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值