一般而言,可以使用以下作为栈的存储结构
#define MAXSIZE 50;
typedef struct
{
int data[MAXSIZE];
int top
}sqStack;
但在实际解题时,最方便的都是使用数组和一个整数来表示,以下也将用这种方法
1. 检查一个括号表达式是否有问题。例如[()()]这样没有问题,但[()(])这就有问题
比较简单,一个基本的栈的运用。第一次10分钟写完,14分钟调试完毕;第二次7分钟写完,10分钟调试完毕。
int checkMatch_2(char m[])
{
char stack[50];
int top = 0; //top使用-1和0是两种习惯
int i = 0;
for(i = 0; m[i] != '\0'; i++)
{
if(m[i] == '[' || m[i] == '(' || m[i] == '{')
stack[top++] = m[i];
else //右括号
{
if(top == 0) return 0;
if(m[i] == ']')
{
if(stack[top - 1] != '[') return 0;
else top--;
}else if(m[i] == ')')
{
if(stack[top - 1] != '(') return 0;
else top--;
}else if(m[i] == '}')
{
if(stack[top - 1] != '{') return 0;
else top--;
}
}
}
if(top == 0) return 1;
else return 0;
}
2. 整数表达式求值,不考虑括号。这个题目我在企业的面试题也刚好遇到过,恰好原题。
总体思路是先乘除后加减。遍历两次,第一次遍历将乘除立即处理,加减压栈;第二次遍历弹栈处理加减。第一次15分钟写完,25分钟调试完毕;第二次18分钟调试完毕。
int isNum_2(char c)
{
return c >= '0' && c <= '9';
}
float compute_2(char* m)
{
int op[50]; int t_op = 0;
float num[50]; int t_num = 0;
int i = 0;
for(i = 0; m[i] != '\0'; i++)
{
if(isNum_2(m[i]))
num[t_num++] = (float)(m[i] - '0');
else if(m[i] == '*')
num[t_num - 1] *= (m[++i] - '0');
else if(m[i] == '/')
num[t_num - 1] /= (float)(m[++i] - '0');
else
op[t_op++] = m[i];
}
for(i = 0; i < t_op; i++)
{
if(op[i] == '+')
num[i + 1] += num[i];
else if(op[i] == '-')
num[i + 1] = num[i] - num[i + 1];
}
return num[t_op];
}