算法设计学习:栈算法

(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值