一.用栈实现进制转换
代码如下:
运行结果如下:
二.逆波兰表达式(中缀转换后缀并求后缀表达式的值)
void midchangeho(char* s,char* sum,int* stop)//sum中存放逆波兰表达式,stop是sum的大小
{
int n = strlen(s);
char num[1000]={0};//num则是求逆波兰表达式中的栈
int top = 0;
for (int i = 0; i < n; i++)
{
if (s[i] >= '0' && s[i] <= '9')//判断是数字子符
{
sum[(*stop)++] = s[i];//因为是数字字符进栈后直接出栈因此直接进入sum中
continue;
}
switch (s[i])//判断是什么字符
{
case '(':
num[top++] = '(';//左括号直接进栈
break;
case ')':
while (top > 0 && num[top - 1] != '(')//为右括号则一直出栈并加入到sum中直至
sum[(*stop)++] = num[--top]; //栈顶指针指向左括号上一个位置
top--;//把左括号出栈
break;
case '*': //ASCII为42 因为*是最大的因此直接入栈
num[top++] = s[i];
break;
case '/': //ASCII为47
while(top > 0 &&num[top-1]=='*' && num[top - 1] != '(')//因为/为第二大,因此只需判断top-1是否是*
sum[(*stop)++] = num[--top];
num[top++] = s[i];//把/加入num
break;
case '+': //ASCII为43
while (top > 0 && num[top - 1] != '-'&&num[top-1]!='(')//因为+为第三大,因此只需判断top-1是否是-
sum[(*stop)++] = num[--top];
num[top++] = s[i];//把+加入num
break;
case '-': //ASCII为45
while(top!=0 && num[top - 1] != '(')
sum[(*stop)++] = num[--top];//因为-为最小,因此只需一直出栈直至top=0
num[top++] = s[i];//把/加入num
break;
}
}
while (top)//直至最后num中还有值,一一出栈
{
sum[(*stop)++] = num[--top];
}
sum[(*stop)] = '\0';
}
逆波兰式的求值:把数字字符直接入栈,直至+-*/要入栈时把栈顶的两个数字字符进行待入栈的运算后把运算完的值再进栈
void getnum(char* sum)
{
char num[20] = { 0 };
char str[10];
int top = 0, a = 0, b = 0,c=0;
int result = 0;
int n = strlen(sum);
for (int i = 0; i < n; i++)
{
if (sum[i] >= '0' && sum[i] <= '9')//为数字字符直接入栈
{
num[top++] = sum[i];
continue;
}
switch (sum[i])
{
case '+':
a = num[--top] - '0';//-'0'是把字符变成整型
b= num[--top] - '0';
c = a + b;
num[top++] = c+'0';//+'0'是把整型变成字符型
break;
case '-':
a = (num[--top]-'0') * (-1) ;
b=num[--top] - '0';
c = a + b;
num[top++] =c+ '0';
break;
case '*':
a = (num[--top] - '0');
b= (num[--top] - '0');
c = a * b;
num[top++] = c + '0';
break;
case '/':
a = num[--top]-'0';
b = num[--top]-'0';
result = b / a;
num[top++] = result+'0';
break;
}
}
printf("%d", num[top-1]-'0');
}
完整代码如下:
void midchangeho(char* s,char* sum,int* stop)//sum中存放逆波兰表达式,stop是sum的大小
{
int n = strlen(s);
char num[1000]={0};//num则是求逆波兰表达式中的栈
int top = 0;
for (int i = 0; i < n; i++)
{
if (s[i] >= '0' && s[i] <= '9')//判断是数字子符
{
sum[(*stop)++] = s[i];//因为是数字字符进栈后直接出栈因此直接进入sum中
continue;
}
switch (s[i])//判断是什么字符
{
case '(':
num[top++] = '(';//左括号直接进栈
break;
case ')':
while (top > 0 && num[top - 1] != '(')//为右括号则一直出栈并加入到sum中直至
sum[(*stop)++] = num[--top]; //栈顶指针指向左括号上一个位置
top--;//把左括号出栈
break;
case '*': //ASCII为42 因为*是最大的因此直接入栈
num[top++] = s[i];
break;
case '/': //ASCII为47
while(top > 0 &&num[top-1]=='*' && num[top - 1] != '(')//因为/为第二大,因此只需判断top-1是否是*
sum[(*stop)++] = num[--top];
num[top++] = s[i];//把/加入num
break;
case '+': //ASCII为43
while (top > 0 && num[top - 1] != '-'&&num[top-1]!='(')//因为+为第三大,因此只需判断top-1是否是-
sum[(*stop)++] = num[--top];
num[top++] = s[i];//把+加入num
break;
case '-': //ASCII为45
while(top!=0 && num[top - 1] != '(')
sum[(*stop)++] = num[--top];//因为-为最小,因此只需一直出栈直至top=0
num[top++] = s[i];//把/加入num
break;
}
}
while (top)//直至最后num中还有值,一一出栈
{
sum[(*stop)++] = num[--top];
}
sum[(*stop)] = '\0';
}
void getnum(char* sum)
{
char num[20] = { 0 };
char str[10];
int top = 0, a = 0, b = 0,c=0;
int result = 0;
int n = strlen(sum);
for (int i = 0; i < n; i++)
{
if (sum[i] >= '0' && sum[i] <= '9')//为数字字符直接入栈
{
num[top++] = sum[i];
continue;
}
switch (sum[i])
{
case '+':
a = num[--top] - '0';//-'0'是把字符变成整型
b= num[--top] - '0';
c = a + b;
num[top++] = c+'0';//+'0'是把整型变成字符型
break;
case '-':
a = (num[--top]-'0') * (-1) ;
b=num[--top] - '0';
c = a + b;
num[top++] =c+ '0';
break;
case '*':
a = (num[--top] - '0');
b= (num[--top] - '0');
c = a * b;
num[top++] = c + '0';
break;
case '/':
a = num[--top]-'0';
b = num[--top]-'0';
result = b / a;
num[top++] = result+'0';
break;
}
}
printf("%d", num[top-1]-'0');
}
/*检测*/
int main()
{
char* s = "5*6-(9+8)";
char sum[20];
int number = 0;
midchangeho(s,sum,&number);//求逆波兰表达式,此代码中s不可有超过两位数的数字字符
printf("%s\n", sum);
getnum(sum);
return 0;
}