实现中缀整数表达式求值--使用数组实现,在数组头处一个栈,在数组尾部有另一个栈
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));
}
{
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));
}
相关文章推荐
- List的All方法使用问题:我用List1的All方法来确保List1的所有每个数组元素中是否包含Arr1中的任意元素,这个部分很难实现。 因为,没有一个数组中是否包含另一个数组中的任意元素这个功能
- (旋转数组问题)给定一个整数类型的循环有序数组,求循环数组的特定值,使用二分查找法(JAVA实现)
- java 编写程序实现从控制台接收一个 5 位以上的整数,使用数组来判断该数字 * 是否是回文数。(例如:789987,12344321是回文数)
- 求一个整数数组的最大元素,用递归方法实现
- 13--输入一个整数数组,实现一个函数来调整数组中数字的顺序
- 给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数,请在这个特殊数组中找出给定的整数
- ;ArrayFill 使用16位的随机整数序列填充一个数组
- 使用函数指针,完成一个sort()函数,能对任何类型的数组元素进行排序: 回调函数 以及 memcpy ()原型实现
- 一个神奇的实现:计算数组尾部对称长度
- 给定一个整数数组,两个数字的返回索引将它们加到一个特定的目标中。 您可以假设每个输入都只有一个解决方案,并且您可能不会两次使用相同的元素。
- 使用main函数的参数,实现一个整数计数器
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。(Python实现)
- 在一个方法里生成了一个自动释放的数组,在另一个方法里使用它会导致程序崩溃。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 剑指offer题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 【源码】将一个整数的每位数分解并按逆序放入一个数组中(用递归算法)(C语言实现)
- 实现求出若干整数之和为500的连续整数(如98,99,100,101,102)的所有组合&&产生一个int数组,长度为100,并向其中随机插入1~100,要求不能重复
- 【源代码】将一个整数的每位数分解并按逆序放入一个数组中(用递归算法)(C语言实现)
- 调整数组使奇数全部都位于偶数前面。 题目: 输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。