括号匹配
//括号的匹配
int matching()
{
Stack s;
InitStack(s);
int flag = 1;
char ch[10] = "[(]]#";
//读入
//cin >> ch;
int i = 0;
while (ch[i] != '#' && flag != 0)//假设字符串以#结尾
{
if (ch [i] == '(' || ch[i] == '[')
{
PushbackStack(s, ch[i]);//入栈
}
if (ch[i] == ')' || ch[i] == ']')
{
if (IsEmpty(s))
{
flag = 0;
break;
}
//判断是否匹配并将栈顶元素出栈
ElemType tmp = StackTop(s);
flag = ISMatch(tmp, ch[i]);
}
i++;
//读入下一个字符
//cin >> ch;
}
//如果栈空且flag=1,则匹配成功
if (IsEmpty(s) && flag == 1)
return OK;
return ERROR;
}
int ISMatch(char tmp,char ch)
{
if ((tmp == '(' && ch == ')') || (tmp == '[' && ch == ']'))
return OK;
else
return ERROR;
}
表达式求值
原理:
图片来自《数据结构》严蔚敏 李冬梅 吴伟民 编著
【算法描述】
//优先级比较>——1,<——-1,=——0,
char PriorityComparison(char c1, char ch)
{
char s[7] = { '+','-','*','/','(',')','#' };
//s[0]-》+
int Priority[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,3},
{1,1,1,1,3,1,1},
{-1,-1,-1,-1,-1,3,0}
};
int i = 0;
for (; i < 7; i++)
{
if (s[i] == c1)
break;
}
int j = 0;
for (; j< 7; j++)
{
if (s[j] == ch)
break;
}
int flag = Priority[i][j];
if (flag == 1)
return '>';
else if (flag == 0)
return '=';
else if (flag == -1)
return '<';
/*else
*/;
}
//计算
int calculating(int num1, char s, int num2)
{
switch (s)
{
case'+':
return num1 + num2;
case'-':
return num1 - num2;
case'*':
return num1 * num2;
case'/':
return num1 / num2;
}
}
//表达式求值
char EvaluateExpression()
{
//OPTR:存放符号,OPND:存放数字
Stack OPTR, OPND;
//int ch;
char ch;
InitStack(OPTR);
InitStack(OPND);
//先把'#'入栈
cin >> ch;
PushbackStack(OPTR, ch);
cin >> ch;
while (ch!='#'||StackTop(OPTR)!='#')
{
if (isdigit(ch))
{
PushbackStack(OPND, ch-48);//将字符转为数字,如果是ch,结果为-1
cin >> ch;
}
else
{
//PushbackStack(OPTR, ch);
//获取栈顶元素并比较
char c1 = StackTop(OPTR);
char c = PriorityComparison(c1, ch);
switch (c)
{
case'>':
//弹出两个数字
//int b = Popback(OPND);
//int a = Popback(OPND);
c1=Popback(OPTR);//符号出栈
PushbackStack(OPND, calculating(Popback(OPND),
c1, Popback(OPND)));//计算结果并入栈
break;
case'<':
PushbackStack(OPTR, ch);
cin >> ch;
break;
case'=':
//弹出栈顶的‘(’
Popback(OPTR);
cin >> ch;
break;
}
}
}
return (int)StackTop(OPND);
}