数据结构括号匹配实验讲义Word格式.docx
《数据结构括号匹配实验讲义Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构括号匹配实验讲义Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
//后继指针
Node()
{
pre=NULL;
next=NULL;
}
Node(elemente)
{
ele=e;
Node*MakeNode(elemente)//传入参数返回一个节点指针,实现参数的封装。
Node<
element>
*temp=newNode(e);
returntemp;
};
MyListStack链栈
classMyListStack
Node<
*base;
*top;
intindex;
MyListStack()//初始化链表
base=newNode<
();
top=base;
index=0;
voidpush(elementn)//push
*temp=newNode<
(n);
top->
next=temp;
temp->
pre=top;
top=temp;
index++;
voidpop(element&
out)//pop
out=top->
ele;
top=top->
pre;
deletetop->
next;
next=NULL;
index--;
BOOLisEmpty();
//返回栈是否为空
if(index)
returnFALSE;
else
returnTRUE;
virtual~MyListStack()//析构链栈,释放空间。
*p=base;
*q=p->
while(p->
next!
=NULL)
{
deletep;
p=q;
q=p->
}
deletep;
(2)涉及的操作
voidCKuohaopipeiDlg:
:
OnButtonClear()//清空窗口控件。
OnButtonSlowShow(//慢速显示运行过程。
OnOK()//进行括号匹配过程。
OnSelchangeListInfo()//此函数响应列表框中光标改变的消息,定位错误的位置。
2.3.实现注释
(此部分见源代码中注释)
2.4.详细设计表示
(1)流程示意图
图表1匹配流程示意图
(2)功能示意图
图表2功能示意图
3.用户手册
(1)在编辑框中输入表达式串。
(2)点击开始匹配测试则进行快速匹配。
(3)点击慢速运行。
(4)点击错误信息,定位错误字符。
4.调试报告
输入:
{{{[1+1]+(A+d)}}}结果:
正确
{{{{}}}}))结果:
错误
}()){}}结果:
([][]))结果:
5.源代码及运行结果截图
(1)源代码
OnOK()
//TODO:
Addextravalidationhere
UpdateData(TRUE);
//MyListStack<
char>
ls;
m_list_info.ResetContent();
//清空list
m_list_stack.ResetContent();
BOOLisNum=0;
BOOLisError=0;
intinputlength=m_cstring_input.GetLength();
if(inputlength==0)
MessageBox("
输入值不能为空!
"
"
提示"
);
//如果字符串为空
else
for(intj=0;
j<
inputlength;
j++)//获取输入字串的长度
{
charstr_in=m_cstring_input.GetAt(j);
if(str_in=='
('
||str_in=='
['
{'
)
{
isNum=1;
ls.push(str_in);
//若为左括号则入栈
CStringtemp;
temp.Format("
push%cintostack\r\n"
str_in);
m_list_info.AddString(temp);
}
elseif(str_in=='
)'
]'
}'
)//若为右括号则出栈匹配
charstr_out;
if(!
ls.isEmpty())
{
ls.pop(str_out);
BOOLflag=0;
if(str_in=='
&
str_out=='
)
{
flag=1;
}
if(!
flag//如果匹配不成功,则isError变量为1,并更新提示信息。
isError=1;
CStringtemp;
temp.Format("
push%cbutcannotmatch%c<
--error!
str_out,str_in);
m_list_info.AddString(temp);
else//如果匹配成功,更新提示信息。
CStringtemp;
temp.Format("
pop%coutofstack\r\n"
str_out);
m_list_info.AddString(temp);
}
else//如果当前栈为空,且输入为右括号时,isError为1,并更新控件信息。
isError=1;
CStringtemp;
temp.Format("
cannotmatch%c<
m_list_info.AddString(temp);
m_list_info.RedrawWindow();
UpdateData(FALSE);
if(!
ls.isEmpty())//如果栈最后不为空,且栈中还有左括号,则提示栈中左括号没有匹配完成。
chartemp;
ls.pop(temp);
ls.push(temp);
if(temp=='
||temp=='
temp="
stackisnotempty<
;
if(ls.isEmpty()&
isNum==1&
!
isError)
m_list_info.AddString("
matchsuccess!
MessageBox("
匹配成功!
elseif((!
ls.isEmpty()&
isNum==1)||isError)
m_list_info.AddString("
matchfailed!
匹配失败!
elseif(isNum==0)
表达式中未出现括号!
chartemp;
while(ls.index!
=0)
ls.pop(temp);
((CEdit*)GetDlgItem(IDC_EDIT_INPUT))->
SetFocus();
SetSel(0,-1);
}
OnButtonSlowShow()//慢速显示运行过程
Addyourcontrolnotificationhandlercodehere
//TODO:
m_list_info.SetRedraw();
m_list_stack.SetRedraw();
//判断是否出现括号
//判断是否出现错误
//获取输入字串长度
j++)//逐次获取字符
)//如果为左括弧,则入栈。
m_list_info.SetCurSel(m_list_info.GetCount()-1);
%c"
m_list_stack.AddString(temp);
)//如果为右括弧
//pop括号,判断是否匹配
flag)
//如果不匹配,则此变量为真,便于函数末尾判断。
//将信息传入控件
m_list_stack.DeleteString(m_list_stack.GetCount()-1);
m_list_info.SetCurSel(m_list_info.GetCount()-1);
else//如果匹配成功,将信息显示到控件。
m_list_stack.DeleteString(m_list_stack.GetCount()-1);
m_list_info.SetCurSel(m_list_info.GetCount()-1);
else
//如果栈中无括号了,且输入括号为右括号。
m_list_info.SetCurSel(m_list_info.GetCount()-1);
//重画控件
m_list_stack.RedrawWindow();
Sleep(600);
ls.isEmpty())//如果栈中还有左括号,说明右括号的数量小于左括号的数量。
//提示栈中还有未匹配的左括号。
while(ls.index!
=0)//清空栈中的内容
OnButtonClear()
SetWindowText("
//此函数中清空所有编辑框和listbox中的记录
m_list_info.RedrawWindow();
//重画所有的控件
m_list_stack.RedrawWindow();
OnSelchangeListInfo()//此函数响应列表框中光标改变的消息,定位错误的位置。
inti;
i=m_list_info.GetCurSel();
if(i!
=LB_ERR&
i<
m_cstring_input.GetLength())
((CEdit*)GetDlgItem(IDC_EDIT_INPUT))->
//定位错误
((CEdit*)GetDlgItem(IDC_EDIT_INPUT))->
SetSel(i,i+1);
(2)运行截图
图表3运行效果图1
图表4运行效果图2