您的位置:首页 > 其它

实现中缀整数表达式求值--使用数组实现,在数组头处一个栈,在数组尾部有另一个栈

2013-02-27 15:33 483 查看
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));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐