实验项目名称:栈的算法实现及应用
实验目的:熟悉栈的逻辑特性、存储表示方法和栈的基本操作。
实验要求:了解并熟悉栈的逻辑特性、顺序和链式存储表示方法和栈的基本操作的实现和应用。
实验内容:
编写程序实现下列的要求:
(1)编写程序,用不同的存储方法(顺序栈+链栈),实现栈的基本操作。
/*顺序栈*/
#include <iostream>
using namespace std;
const int MAX_SIZE = 100;
//顺序栈
class SeqStack {
public:
SeqStack() {
top = -1; //构造函数,初始化一个空栈
}
~SeqStack(){}; //析构函数为空
void Push(int x); //入栈操作,将元素x入栈
int Pop(); //出栈操作,将栈顶元素弹出
int GetTop(); //取栈顶元素(并不删除)
bool Empty() {
return top == - 1 ? true : false; //判断栈是否为空
}
void Print(); //遍历操作
private:
int data[MAX_SIZE];//存放栈元素的数组
int top; //栈顶元素在数组的下标
};
//入栈
void SeqStack:: Push(int x) {
if (top == MAX_SIZE - 1) throw "上溢";
top++;
data[top] = x;
}
//出栈
int SeqStack:: Pop() {
int x;
if (top == -1) throw"下溢";
x = data[top--];
return x;
}
//取栈顶元素(并不删除)
int SeqStack:: GetTop() {
if(top != -1)
return data[top];
}
//遍历
void SeqStack:: Print() {
for( int i = 0 ; i <= top ; i++) {
cout << data[i] << " ";
}
cout << endl;
}
int main( ) {
cout << "请输入要定义的栈的元素个数:n=";
int n ; //定义栈的元素个数
cin >> n; //输入n
int a[n];
int i, x;
SeqStack z;
cout << "请按顺序输入n个要推进栈的元素:" << endl;
for(int i = 0; i < n; i++) {
cin >> a[i];
}
for(int i = 0; i < n; i++) {
z.Push(a[i]);
}
cout << "当前栈结果如下:(从左到右依次为栈底到栈顶)" << endl;
z.Print();
cout << "当前栈顶元素为:" << z.GetTop() << endl;
cout << "栈顶元素"<< z.GetTop() << "出栈 " << " 结果如下:(从左到右依次为栈底到栈顶)" << endl;
z.Pop();
z.Print();
cout << "当前栈顶元素为:" << z.GetTop() << endl;
return 0;
}
/*链栈*/
#include <iostream>
using namespace std;
struct Node {
int data; //数据域
Node *next; //指针域
};
class LinkStack {
public:
LinkStack(); //构造函数,初始化一个空栈
~LinkStack(); //析构函数,释放链栈各结点的存储空间
void Push(int x); //入栈操作,将元素x入栈
int Pop(); //出栈操作,将栈顶元素出栈
int GetTop(); //取栈顶元素(并不删除)
void Print(); //遍历操作
private:
Node *top; //栈顶指针即链栈的头指针
};
//链栈的构造函数
LinkStack::LinkStack() {
top = new Node ; //生成头结点
top = NULL; //头结点的指针域置空
}
//析构函数
LinkStack::~LinkStack() {
Node *q = NULL;
while(top != NULL) { //释放链栈的每一个结点的存储空间
q = top; //暂存被释放结点
top = top->next; //top指向被释放结点的下一个结点
delete q;
}
}
//入栈操作
void LinkStack::Push(int x) {
Node *s;
s = new Node;
s->data = x; //申请结点s 数据域为x
s->next = top;
top = s; //将结点s插在栈顶
}
//出栈操作
int LinkStack::Pop() {
Node *p = NULL;
int x;
if(top == NULL) throw"下溢";
x = top->data;
p = top; //暂存栈顶元素
top = top->next; //将栈顶结点摘链
delete p;
return x;
}
//取栈顶元素操作
int LinkStack:: GetTop() {
if(top == NULL) throw"下溢异常";
else return top->data;
}
//遍历操作
void LinkStack::Print() {
Node *p = top; //工作指针p初始化
while(p != NULL) {
cout << p->data << " ";
p = p->next; //工作指针p后移,注意不能写作p++
}
cout << endl;
}
int main( ) {
cout << "请输入要定义的栈的元素个数:n=";
int n ; //定义栈的元素个数
cin >> n; //输入n
int a[n];
int i, x;
LinkStack z;
cout << "请按顺序输入n个要推进栈的元素:" << endl;
for(int i = 0; i < n; i++) {
cin >> a[i];
}
for(int i = 0; i < n; i++) {
z.Push(a[i]);
}
cout << "当前栈结果如下:(从左到右依次为栈顶到栈底)" << endl;
z.Print();
cout << "当前栈顶元素为:" << z.GetTop() << endl;
cout << "栈顶元素"<< z.GetTop() << "出栈 " << " 结果如下:(从左到右依次为栈顶到栈底)" << endl;
z.Pop();
z.Print();
cout << "当前栈顶元素为:" << z.GetTop() << endl;
return 0;
}
(2) * 判断一个表达式中的括号(仅有一种括号,小、中或大括号)是否配对。编写并实现它的算法。
/*判断表达式中小括号是否匹配*/
#include <iostream>
#include <string>
using namespace std;
class Matcher {
public:
Matcher(string str);
~Matcher() { }; /*析构函数为空*/
int match();
private:
string str;
};
Matcher :: Matcher(string str) {
this->str = str;
}
int Matcher :: match() {
string S; /*定义一个字符对象 */
int i, top = -1; /* top为字符对象S的尾指针 */
for (i = 0; str[i] != '\0'; i++) { /* 依次对str对象的每个字符, str[i]进行处理 */
if (str[i] == ')') { /*当前扫描的字符是右括号*/
if (top > -1) top--; /*出栈前判断栈是否为空*/
else return -1;
} else if (str[i] == '(') /*当前扫描的字符是左括号*/
S[++top] = str[i]; /*执行入栈操作*/
}
if (top == -1) return 0; /*栈空则括号正确匹配*/
else return 1;
}
int main( ) {
string str; /*定义尽可能大的字符数组以接收键盘的输入*/
int k; /*k接收调用函数Match的结果*/
cout << "请输入一个算术表达式:";
cin >> str; /*将表达式以字符串方式输入*/
Matcher M(str); /*定义对象变量M*/
k = M.match(); /*函数调用,实参为字符数组的首地址*/
if (k == 0) {
cout << str;
cout << "正确匹配" << endl;
} else if (k == 1) {
cout << "多左括号" << endl;
} else {
cout << "多右括号" << endl;
}
return 0;
}

2477

被折叠的 条评论
为什么被折叠?



