《数据结构》学习记录(6):链栈

一、概念

1、链栈

采用链表存储的栈。

二、链栈的基本操作

1、定义链栈

#define elemType char
struct LinkStNode
{     
    elemType data;		//数据域
    LinkStNode *next;	//指针域
};

2、初始化链栈

void InitStack(LinkStNode *&s)
{      
    s = new LinkStNode;
    s->next = nullptr;
}

3、销毁链栈

void DestroyStack(LinkStNode *&s)
{
    LinkStNode *p = s,*q = s->next;
    while (q)
    {	
        delete p;
        p = q;
        q = p->next;
    }
    delete p;	//此时p指向尾结点,释放其空间
}

4、链栈是否为空

bool StackEmpty(LinkStNode *s)
{
    return s->next == nullptr;
}

5、进栈

void Push(LinkStNode *&s,elemType e)
{      
    LinkStNode * p = new LinkStNode;
    p->data = e;		//新建元素e对应的结点*p
    p->next = s->next;	//插入*p结点作为开始结点
    s->next = p;
}

6、出栈

bool Pop(LinkStNode *&s,elemType &e)
{     
    if (!s->next)		//栈空的情况
        return false;
    LinkStNode * p = s->next;			//p指向开始结点
    e = p->data;
    s->next = p->next;		//删除*p结点
    delete p;               //释放*p结点
    return true;
}

7、取栈顶元素

bool GetTop(LinkStNode *s,elemType &e)
{      
    if (!s->next)	//栈空的情况
        return false;
    e = s->next->data;
    return true;
}

三、一个例子

 

即“(”符号进栈,如果遇到“)”时获取栈顶元素,对比是否匹配。

bool Match(char exp[],int n)
{     
    LinkStNode *st;
    InitStack(st);		      	//初始化栈
    int i = 0; 
    char e;  
    bool match = true; 
      
    while (i < n && match)	//扫描exp中所有字符
    { 
        if (exp[i] == '(')
        {
            Push(st,exp[i]);
        }
        else if (exp[i] == ')') 		//当前字符为右括号
        {      
            if (GetTop(st,e))
            {    
                if (e != '(')	   	//栈顶元素不为'('时表示不匹配
                    match = false;
                else
                    Pop(st,e);    	//将栈顶元素出栈
            }
            else 
            {
                match = false;  	//无法取栈顶元素时表示不匹配
            }
        }
        i++;			//继续处理其他字符
    }
    if (!StackEmpty(st))	
        match = false;
    
    DestroyStack(st);	     	//销毁栈
    return match;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值