struct shareIndex
{
INT top;
INT flag;
};
struct shareArray
{
CHAR* item;
struct shareIndex stack1;
struct shareIndex stack2;
};
void DataStacksShareInital(INT);
void DataStacksSharePush(INT,CHAR);
CHAR DataStacksSharePop(INT);
void DataStacksShareFree();
CHAR DataStacksShareView(INT flag);
typedef struct shareArray* ShareArray;
static ShareArray g_shareArray;
static INT shareTotlal;
void DataStacksShareInital(INT max)
{
if (max <= 0)
{
printf("max <=0");
return;
}
g_shareArray = malloc(sizeof(*g_shareArray));
if (!g_shareArray)
{
printf("g_shareArray is null");
return;
}
g_shareArray->item = malloc(sizeof(CHAR)*max);
if (!(g_shareArray->item))
{
printf("g_shareArray->item is null");
return;
}
memset(g_shareArray->item,0, sizeof(CHAR)*max);
g_shareArray->stack1.flag = 1;
g_shareArray->stack1.top = -1;
g_shareArray->stack2.flag = 2;
g_shareArray->stack2.top = max;
shareTotlal = max;
}
INT IsFull()
{
return (g_shareArray->stack1.top+1 == g_shareArray->stack2.top);
}
INT IsEmpty()
{
return ((g_shareArray->stack1.top == -1)||(g_shareArray->stack2.top == shareTotlal));
}
void DataStacksSharePush(INT flag,CHAR item)
{
if (IsFull())
{
printf("isfull");
return;
}
switch (flag)
{
case 1:
g_shareArray->stack1.top +=1;
g_shareArray->item[g_shareArray->stack1.top] = item;
break;
case 2:
g_shareArray->stack2.top -=1;
g_shareArray->item[g_shareArray->stack2.top] = item;
break;
default:
break;
}
}
CHAR DataStacksSharePop(INT flag)
{
switch (flag)
{
case 1:
if (g_shareArray->stack1.top == -1)
{
printf("header IsEmpty\n");
return '\0';
}
return g_shareArray->item[g_shareArray->stack1.top--];
case 2:
if (g_shareArray->stack2.top == shareTotlal)
{
printf("end IsEmpty\n");
return '\0';
}
return g_shareArray->item[g_shareArray->stack2.top++];
default:
break;
}
return '\0';
}
void DataStacksShareFree()
{
free(g_shareArray->item);
free(g_shareArray);
}
CHAR DataStacksShareView(INT flag)
{
switch (flag)
{
case 1:
if (g_shareArray->stack1.top == -1)
{
printf("DataStacksShareView header IsEmpty\n");
return '\0';
}
return g_shareArray->item[g_shareArray->stack1.top];
case 2:
if (g_shareArray->stack2.top == shareTotlal)
{
printf("DataStacksShareView end IsEmpty\n");
return '\0';
}
return g_shareArray->item[g_shareArray->stack2.top];
default:
break;
}
return '\0';
}
enum GRADE
{
leftBrackets = -1,
None,
AddAndMinus,
MulitAndDiv,
};
typedef enum GRADE Grade;
Grade TestGrade(CHAR operator)
{
Grade gradeStack = None;
if (operator == '\0')
{
gradeStack = None;
}
else if(operator == '+')
{
gradeStack = AddAndMinus;
}
else if(operator == '*')
{
gradeStack = MulitAndDiv;
}
return gradeStack;
}
void calStack(Grade gradeStack)
{
switch (gradeStack)
{
case AddAndMinus:
{
INT temp3 = DataStacksSharePop(1)-'0';
INT temp4 = DataStacksSharePop(1)-'0';
DataStacksSharePush(1,(temp3+temp4)+'0');
break;
}
case MulitAndDiv:
{
INT temp3 = DataStacksSharePop(1)-'0';
INT temp4 = DataStacksSharePop(1)-'0';
DataStacksSharePush(1,temp3*temp4+'0');
break;
}
default:
break;
}
}
void IsGrade(CHAR operator)
{
Grade gradeStack = TestGrade(operator);
calStack(gradeStack);
}
void result(Grade grade,Grade gradeStack)
{
do {
CHAR operator = DataStacksShareView(2);
gradeStack = TestGrade(operator);
if (grade <= gradeStack)
{
calStack(gradeStack);
DataStacksSharePop(2);
}
} while ((grade <= gradeStack)&&(gradeStack != None));
}
void secondFix(char* aSource)
{
if (!aSource)
{
return;
}
int len = (INT)strlen(aSource);
CHAR* a = aSource;
DataStacksShareInital(len);
for (int i = 0;i <= len;++i)
{
if ((a[i] >= '0')&&(a[i] <= '9'))
{
DataStacksSharePush(1,a[i]);
}
if (a[i] == '(')
{
DataStacksSharePush(2,a[i]);
}
if (a[i] == ')')
{
CHAR operator = DataStacksSharePop(2);
while (operator != '(')
{
IsGrade(operator);
operator = DataStacksSharePop(2);
}
}
if (a[i] == '*'||a[i] == '+')
{
Grade grade = TestGrade(a[i]);
Grade gradeStack = None;
result(grade,gradeStack);
DataStacksSharePush(2,a[i]);
}
if (a[i] == '\0')//结束的标志
{
Grade grade = None;
Grade gradeStack = None;
result(grade,gradeStack);
}
}
printf("%c",DataStacksSharePop(1));
}
1100

被折叠的 条评论
为什么被折叠?



