[C语言]中缀表达式转后缀表达式

根据之前的一篇文章就可以实现通过模拟栈来计算表达式了
话都在代码和注释里了呜呜呜

实现中缀表达式转后缀表达式

代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stack>
#include<queue>
using namespace std;

int book[128] = {0};
queue<char*>Queuenum;
stack<char*>Stackchar;
void MidToBack(char (*s)[10],int tokensSize)//tokensSize是总字符串数 
{
	for(int i = 0; i<tokensSize; i++)//遍历字符串 
	{
		int len = strlen(s[i]);//计算每个字符串的长度 
		{
			if(len == 1)//长度为1:字符或者数字
			{
				if(s[i][0] == '(')//如果是左括号就放进字符栈
				{
					Stackchar.push(s[i]);
				}
				else if(s[i][0] == ')')//右括号就放进字符栈并将字符栈'('前的所有字符转移到数字队列 
				{
					char chchar[10];
					while(!Stackchar.empty())
					{
						strcpy(chchar,Stackchar.top());
						if(chchar[0] == '(')
						{
							Stackchar.pop();
							break;
						}
						char* ch = (char*)malloc(sizeof(char)*10);//一定注意!!这里的空间得malloc出来,不然只是直接 char ch[10] 在这个作用域结束时ch这个变量就会被free,而queue里存的是ch(字符串的首地址),而ch已经被free了所以queue存的这个就没有内容了,因此得malloc出一片稳定的空间进行存放数据 
						strcpy(ch,Stackchar.top());
						Queuenum.push(ch);
						//printf("%s ",Queuenum.front());
						Stackchar.pop();
					}
				}
				else if(s[i][0] == '+'||s[i][0] == '-'||s[i][0] == '*'||s[i][0] == '/')//如果是运算符号就一直把符号栈中的符号转移到数字队列除非遇到比它优先级小的符号或者'('
				{
					char chchar[10];
					while(!Stackchar.empty())
					{
						strcpy(chchar,Stackchar.top());
						if(chchar[0]>s[i][0]||chchar[0] == '(')//判断运算符优先级 
							break;
						else
						{
							char* ch = (char*)malloc(sizeof(char)*10);
							strcpy(ch,Stackchar.top());
							Queuenum.push(ch);
							//printf("%s ",Queuenum.front());
							Stackchar.pop();
						}
					}
					Stackchar.push(s[i]);
				}
				else//只能是数字就入数字队列
				{
					char* ch = (char*)malloc(sizeof(char)*10);
					strcpy(ch,s[i]);
					Queuenum.push(ch);
					//printf("%s ",Queuenum.front());
				}
			}
			else//大于1长度只能是数字
			{
				int flag = 0;//标记正负号
				int num = 0;//用于保存字符串数字保存为整数的结果
				for(int j = 0; j<len; j++)
				{
					if(j == 0&&s[i][j] == '-')//第一位如果是'-'就标记为负数
						flag = 1;
					else
						num = num*10+(s[i][j]-'0');
				}
				if(flag)
				{
					num = num * -1;
				}
				char* ch = (char*)malloc(sizeof(char)*10);
				itoa(num,ch,10);//将整数转换为字符串
				Queuenum.push(ch);//入数字队列 
				//printf("%s ",Queuenum.front());
			}
		}
	}
	while(!Stackchar.empty())//最后将所有的字符栈里的字符转移到数字队列 
	{
		char* ch = (char*)malloc(sizeof(char)*10);
		strcpy(ch,Stackchar.top());
		Queuenum.push(ch);
		//printf("%s ",Queuenum.front());
		Stackchar.pop();
	}
}
int main()
{
	book['+'] = book['-'] = 0;//规定优先级 
	book['*'] = book['/'] = 1;
	char tokens[20][10] = {"(","-12","+","3",")","*","-11","/","10","*","17","+","5"};
	MidToBack(tokens,13);
	while(!Queuenum.empty())//输出下 
	{
		printf("%s ",Queuenum.front());
		Queuenum.pop();
	}
	printf("\nOK");
	return 0;
}

效果图

在这里插入图片描述
如果大佬有好的建议,我定洗耳恭听!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值