2011信息安全数据结构实验1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二栈的应用-括号匹配
一、实验目的
1、掌握STL中栈的基本使用
2、练习使用栈进行程序编写
二、实验内容
题目一:STL
下面代码使用STL中的栈进行序列的反转,请修改好下面代码中的语法错误,编译运行
#include
int main( )
/* Pre: The user supplies an integer n and n decimal numbers.
Post: The numbers are printed in reverse order.
Uses: The STL class stack and its methods */
{
int n;
double item;
stack
cout << " Type in an integer n followed by n decimal numbers."
<< endl
<< " The numbers will be printed in reverse order."
<< endl;
cin >> n;
for (int i = 0; i < n; iCC) {
cin >> item;
numbers.push(item);
}
cout << endl << endl;
while (!numbers.empty( )) {
cout << numbers.top( ) << " ";
numbers.pop( );
}
cout << endl;
}
提示:
(1)由于程序是用了STL(标准模板库,可以简单的看成是一个函数库,在其中有各种有用的类、函数和算法),栈在其中有实现。栈在STL中的实现用到了类模板,也就是说其栈
是独立于类型的,模板提供参数化类型,也就是能将类型名作为参数传递给接收方来建立类或函数。比如stack
using namespace std;
题目二:括号匹配
使用STL中的栈编写程序,实现算术表达式中的括号匹配(有能力的同学可以同时进行小括号,大括号,中括号的匹配)
注意:
(1)配对的算术表达式中左右括号的数目应相等
例如:表达式(a+b))和a+b)中的括号不配对
(2)对的算术表达式中每一个左括号都一定有一个右括号与之匹配,并且一定是先出现左括号,才能有右括号
例如:表达式)a+b(+c和(b+a))+(c+d也属于不配对的情况
算法提示:
方式是先创建一个存放左括号的空栈,并将“#”作为栈底元素。顺序扫描表达式,当遇到非括号时,继续扫描,遇到“(”时,进栈,而遇到“)”时,与栈顶元素比较,如果括号匹配,栈顶元素退栈,继续扫描表达式,否则,报错退出。
括号配对检查的原则是:对表达式从左向右扫描。当遇到左括号时,左括号入栈;而遇到右括号时,首先将栈中的栈顶元素弹出栈,再比较弹出元素是否与右括号匹配,如果两者匹配,则操作继续;否则,检查出错,打印“no”,并停止操作。当表达式全部扫描完后,如果栈顶元素为“#”,说明括号作用层次嵌套正确,打印“yes”,并停止操作。
附录:STL中栈的使用
#pragma warning(disable:4786)
#include
#include
using namespace std ;
typedef stack
int main()
{
STACK_INT stack1;
cout << "stack1.empty() returned " <<
(stack1.empty()? "true": "false") << endl; // Function 3
cout << "stack1.push(2)" << endl;
stack1.push(2);
if (!stack1.empty()) // Function 3 cout << "stack1.top() returned " <<
stack1.top() << endl; // Function 1
cout << "stack1.push(5)" << endl;
stack1.push(5);
if (!stack1.empty()) // Function 3 cout << "stack1.top() returned " <<
stack1.top() << endl; // Function 1
cout << "stack1.push(11)" << endl;
stack1.push(11);
if (!stack1.empty()) // Function 3 cout << "stack1.top() returned " <<
stack1.top() << endl; // Function 1
// Modify the top item. Set it to 6.
if (!stack1.empty()) { // Function 3 cout << "stack1.top()=6;" << endl;
stack1.top()=6; // Function 1 }
// Repeat until stack is empty
while (!stack1.empty()) { // Function 3 const int& t=stack1.top(); // Function 2
cout << "stack1.top() returned " << t << endl;
cout << "stack1.pop()" << endl;
stack1.pop();
}
}
运行结果:
stack1.empty() returned true
stack1.push(2)
stack1.top() returned 2
stack1.push(5)
stack1.top() returned 5
stack1.push(11)
stack1.top() returned 11
stack1.top()=6;
stack1.top() returned 6