/*程序的版权和版本声明部分:
*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;
}
运行结果: