一、实验内容:
1.建立一个空栈
2.对已建立的栈进行入栈、出栈、读取栈顶、判空、遍历操作
3.用顺序栈实现十进制数转换为二进制数
4.用顺序栈实现括号匹配算法
二、代码如下:
#include<iostream>
#include <string.h>
using namespace std;
//01模板类声明
const int StackSize = 50;
template<class DataType> //DataType表示虚类型(可以自己定义),可以代替int,double等类型
class SeqStack //定义类模板
{
public:
SeqStack();
~SeqStack(){}
void Push(DataType x); //x表示入栈的元素
DataType Pop();
DataType GetTop();
int Empty();
void printstack(); //遍历输出栈函数
void trans(int b); //十转二进制数
void match(int sl,char array[]); //括号匹配
private:
DataType data[StackSize];
int top;
};
//02类中函数的定义
template<class DataType>
SeqStack<DataType>::SeqStack() //构造函数,栈的初始化
{
top = -1;
}
template<class DataType>
void SeqStack<DataType>::Push(DataType x) //入栈操作
{
if(top == StackSize - 1)
{
throw"上溢";
}
top++;
data[top] = x; //将x插入栈所在的数组中
}
template<class DataType> //出栈操作,删除栈顶元素
DataType SeqStack<DataType>::Pop()
{
DataType x;
if (top == -1)
{
throw"下溢";
}
x = data[top--]; //先赋值,再自减
/*
x = data[top]; //先返回之前的栈顶元素
top--; //栈顶指针再下移
*/
return x; //返回值是出栈前的最初的栈顶元素
}
template<class DataType> //取栈顶
DataType SeqStack<DataType>::GetTop()
{
if(top != -1)
{
return data[top];
}
}
template<class DataType> //判空
int SeqStack<DataType>::Empty()
{
if(top == -1)
{
return 1;
}else
{
return 0;
}
}
template<class DataType> //遍历
void SeqStack<DataType>::printstack()
{
while(top != -1)
{
cout<< data[top]<<" ";
top--;
}
cout<<endl;
}
template<class DataType> //十转二
void SeqStack<DataType>::trans(int b)
{
int y;
while(b > 0)
{
y = b % 2;
Push(y);
b = b / 2;
}
}
template<class DataType> //括号匹配算法
void SeqStack<DataType>::match(int sl,char array[])
{
int i = 0;
while(i < sl)
{
if(array[i] == '(')
{
Push(array[i]);
}else
if(array[i] == ')')
{
if(Empty())
{
cout << "匹配错误!右括号比左括号多!" << endl;
return; /*用return语句直接终止退出match函数*/
}else
{
Pop();
}
}
i++;
}
if(!Empty())
{
cout << "匹配错误!左括号比右括号多!" << endl;
}else
{
cout << "匹配成功!" << endl;
}
}
//主函数
int main()
{
SeqStack<int> S;
if(S.Empty())
{
cout<<"栈为空"<<endl;
}else
{
cout<<"栈非空"<<endl;
}
cout<<"入栈操作"<<endl;
S.Push(7);
S.Push(2);
S.Push(15);
S.Push(6);
cout<<"栈顶元素为:";
cout<<S.GetTop()<<endl;
cout<<"出栈操作"<<endl; //出栈操作
cout<< "执行一次出栈操作,删除元素" << S.Pop() <<endl;
cout<<"栈顶元素为:";
cout<<S.GetTop()<<endl;
cout<<"遍历输出"<<endl; //最后来遍历
S.printstack();
SeqStack<int> SZE; //建立一个栈,实现十进制转二进制
int b;
cout << "请输入一个十进制数" << " ";
cin >> b;
SZE.trans(b);
cout << b << "转换为二进制后结果为: " << endl;
SZE.printstack();
SeqStack<char> MAT; //括号匹配算法
char c[] = "(a+b)-(b/c)))";
int sl;
sl = strlen(c);
cout << "括号匹配算法,表达式为:" << c << endl;
MAT.match(sl,c);
}
运行结果: