最近数据结构学到栈这一块儿,更好可以用栈解决带括号的四则混合运算问题。代码由C语言编写,由于之前学C语言的时候不太用心,加上一年多没写了,导致现在用c写程序的时候频频卡克,程序难免会累赘一些,见谅!代码如下
#include "stdio.h"
#include"stdafx.h"
#include "stdlib.h"
int op[7][7]{
{1, 1, -1, -1, -1, 1,1},
{ 1, 1, -1, -1, -1, 1,1 },
{ 1, 1, 1, 1, -1, 1,1 },
{ 1, 1, 1, 1, -1, 1 ,1},
{-1, -1, -1, -1, -1, 0,2},
{ 1, 1, 1, 1, 2, 1, 1 }, {-1,-1,-1,-1,-1,2,0}};
//表达式中各符号运算优先级顺序表,依次为+,-,*,/,(,),=,
//1表示前者大,-1表示前者小,2只是为了占位,无特殊作用
typedef struct
{
int *base;
int length;
int size;
}OPND;//存放操作数
typedef struct
{
char *base;
int length;
int size;
}OPTR;//存放运算符
OPND initOPND()
{
OPND list1;
list1.base = (int*)malloc(20 * sizeof(int));
if (list1.base)
{
list1.length = 0;
list1.size = 20;
}
return list1;
}
OPTR initOPTR()
{
OPTR list1;
list1.base = (char*)malloc(20 * sizeof(char));
if (list1.base)
{
list1.length = 0;
char c = '=';
list1.base[list1.length]=c;
++list1.length;
list1.size = 20;
}
return list1;
}
OPTR insertChar(OPTR list1, char c)
{
if (list1.length < list1.size)
{
list1.base[list1.length] = c;
list1.length++;
}
return list1;
}
OPND insertNumber(OPND list1, int n)
{
if (list1.length < list1.size)
{
list1.base[list1.length] = n;
list1.length++;
}
return list1;
}
int getNumber(OPND list1)
{
return list1.base[list1.length];
}
OPND popNumber(OPND list1)
{
if (list1.length!=0)
{
int c;
c=list1.base[list1.length-1];
list1.length--;
}
return list1;
}
OPTR popChar(OPTR list1)
{
if (list1.length != 0)
{
char c;
c = list1.base[list1.length-1];
list1.length--;
}
return list1;
}
int precede(char a,char b)
{
char s[] = {a,b};
int n[2] = {0,0};
for (int i = 0; i < 2; i++)
{
switch (s[i])
{
case '+':
n[i] = 0;
break;
case '-':
n[i] = 1;
break;
case '*':
n[i] = 2;
break;
case '/':
n[i] = 3;
break;
case '(':
n[i] = 4;
break;
case ')':
n[i] = 5;
break;
case '=':
n[i] = 6;
break;
}
}
return op[n[0]][n[1]];
}
int calculate(int a, int b, char c)
{
int s = 0;;
switch (c)
{
case '+':s = a + b; break;
case '-':s = a - b; break;
case '*':s = a * b; break;
case '/':s = a / b; break;
default:
break;
}
return s;
}
int main()
{
OPND list1;
OPTR list2;
list1=initOPND();
list2 = initOPTR();
char s[20];
gets_s(s);
int i = 0;
while (s[i]!='\0')
{
if (iswdigit(s[i]))
{
int t = i + 1;
int number = s[i] - '0';
while (s[t] != '\0'&&iswdigit(s[t]))
{
number = 10 * number + s[t] - '0';
t++;
}
i = t;
list1 = insertNumber(list1, number);
}
else
{
char c = list2.base[list2.length - 1];
int m = precede(c, s[i]);
if (m == -1)
{
list2 = insertChar(list2, s[i]);
}
if (m == 0)
{
list2=popChar(list2);
}
if (m == 1)
{
do
{
int result = calculate(list1.base[list1.length - 2], list1.base[list1.length - 1], list2.base[list2.length - 1]);
list1 = popNumber(list1);
list1 = popNumber(list1);
list1 = insertNumber(list1, result);
list2 = popChar(list2);
m = precede(list2.base[list2.length - 1], s[i]);
} while (m==1);
if (m == 0)
list2 = popChar(list2);
else
list2 = insertChar(list2, s[i]);
}
i++;
}
}
printf("结果是%d",list1.base[list1.length-1]);
free(list1.base);
free(list2.base);
return 0;
}