栈链的简单应用

/*程序的版权和版本声明部分:
*Copyright(c)2014,烟台大学计算机学院学生
*All rights reserved.
*文件名称:
*作者:田成琳
*完成日期:2014 年 9 月 26 日
*版本号:v1.0
*对任务及求解方法的描述部分:
*问题描述:栈链的应用
*程序输入:
*程序输出:编写一个算法判断表达式括号是否配对
*问题分析:
*算法设计:从左往右扫描扫描,遇到左括号进栈,
           继续扫描遇到右括号看栈顶是否有左括号。
           若遇到栈顶元素是左括号则左括号出栈;若
           栈顶元素不为左括号或者无法取得栈顶元素
           则也为不匹配。最后判断栈是否为空,栈不为
           空表示内有左括号也是不匹配。
*/
#include<iostream>
#include<cstdlib>
using namespace std;
struct LiStack
{
	int data;           //数据域
	struct LiStack *next; //指针域
};
void InitStack(LiStack *&s);//初始化栈
void DestoryStack(LiStack *&s);//销毁栈
bool StackEmpty(LiStack *s);//判断栈是否为空
void Push(LiStack *&s,char e);//进栈
bool Pop(LiStack *&s);//出栈
bool GetTop(LiStack *&s,char &e);//取栈顶元素
void InitStack(LiStack *&s)
{
    s=(LiStack *)malloc(sizeof(LiStack));
    s->next=NULL;
}
void DestoryStack(LiStack *&s)
{                    //链式结构要逐一释放
    LiStack *p=s,*q=s->next;
    while(q!=NULL)
    {
        free(p);
        p=q;
        q=p->next;
    }
    free(p);
}
bool StackEmpty(LiStack *s)
{
    return(s->next==NULL);
}
void Push(LiStack *&s,char e)
{
    LiStack *p;
    p=(LiStack *)malloc(sizeof(LiStack));
    p->data=e;
    p->next=s->next;
    s->next=p;
}
bool Pop(LiStack *&s)
{
    LiStack *p;
    if(StackEmpty(s))//栈为空
        return false;
    p=s->next;//p指向开始节点
    s->next=p->next;//删除*p节点
    free(p);//释放*p节点
    return true;
}
bool GetTop(LiStack *&s,char &e)
{
    if(StackEmpty(s))
        return false;
    e=s->next->data;
    return true;
}
int main()
{
    string str;
    int length;
    char e;
    LiStack *s;
    bool match;
    InitStack(s);
    cout<<"请输入表达式:"<<endl;
    cin>>str;
    length=str.size();
    for(int i=0;i<length;i++)
    {
        if(str[i]=='(')//遇左括号进栈
            Push(s,str[i]);
        else if(str[i]==')')
        {//遇右括号时要分析栈顶是否为左括号
            if(GetTop(s,e))
            {
                if(e!='(')//不是左括号表示左括号未进过栈
                    match=false;
                else//栈顶是左括号表示匹配同时左括号出栈
                    Pop(s);
            }
            else//无法取得栈顶元素时不匹配
                match=false;
        }
    }
    if(!StackEmpty(s))//栈不为空表示不匹配
        match=false;
    DestoryStack(s);
    if(match)
        cout<<"匹配."<<endl;
    else
        cout<<"不匹配."<<endl;
    return 0;
}

运行结果:


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值