根据之前的一篇文章就可以实现通过模拟栈来计算表达式了
话都在代码和注释里了呜呜呜
代码
#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;
}
效果图
如果大佬有好的建议,我定洗耳恭听!