(1)题目:C语言中算术表达式中的括号只有小括号。编写算法,判断表达式中的括号是否正确匹配,表达式已经存在字符数组exp[]中(元素从数组小标1开始存储),字符个数为n。
分析:即在解决问题的过程中,出现了一个状态,但是凭现有条件不能判断当前的状态是否可以解决,需要记下,等待以后出现可以解决当前状态的条件后返回来再解决。使用栈来解决,栈具有记忆功能,这是栈FILO的延伸。
代码:
int match(char exp[], int n)
{
char stack[maxSize]; //完成栈的初始化声明
int top = -1;
int i;
for ( i = 1; i <= n; ++ i )
{
if ('(' == exp[i]) //遇到‘(’,入栈后等待处理,
{
stack[ ++ top] = '('; //入栈操作
}
if (')' == exp[i])
{
if ( -1 == top) //如果遇到‘)’且栈已空,则不匹配,返回0
{
return 0;
}
else
{
top --; //栈不空,出栈。相当于划掉‘(’与‘)’的操作。
}
}
}
if ( -1 == top ) //栈空,说明括号是匹配的
{
return 1;
}
else //否则括号不匹配
{
return 0;
}
}
(2)题目:用不带头结点的单链表存储链栈,设计初始化、判断空栈,进栈和出栈等算法
分析:不带头结点的单链表lst为空的条件为 lst == NULL,进出栈都是在表头进行的。
//初始化链栈
void initStackl(LNode *&lst)
{
st = NULL;
}
//判断栈空
int isEmptyl(LNode *lst)
{
if (NULL == lst)
{
return 1;
}
else
{
return 0;
}
}
//进栈
void Pushl(LNode *&lst, int x)
{
LNode *p;
p = (LNode *)malloc(sizeof(LNode));
p->next = NULL;
p->data = x;
p->next = lst; //插入操作
lst = p;
}
//出栈
int Pop(LNode *&lst, int &x) //需要改变的变量要用引用型
{
LNode *p;
if (NULL == lst)
{
return 0;
}
//删除结点操作
p = lst; //p指向第一个数据结点
x = p->data;
lst = p->next;
free(p);
return 1;
}