数据结构栈1.docx
《数据结构栈1.docx》由会员分享,可在线阅读,更多相关《数据结构栈1.docx(13页珍藏版)》请在冰豆网上搜索。
数据结构栈1
大学数据结构课程实验报告
课程名称:
数据结构
班级:
软件1011
实验成绩:
指导教师:
姓名:
实验项目名称:
数据结构---栈
学号:
上机实践日期:
一、目的
理解栈数据结构及其应用;
理解递归及其应用
二、实验内容
1.栈的类定义
2.顺序栈的类定义、实现与测试;链栈的类定义、实现与测试
3.栈的应用1(可使用顺序栈或链栈完成):
实现括号匹配
测试如下表达式:
”{[()](())}”及”{[()]]}”
三、实验使用环境
VC++6.0控制台程序
四、实验关键代码与结果展示(部分截图)
1、栈的类定义:
constintmaxSize=50;
template
classStack
{
public:
Stack(){};
virtual~Stack();
virtualvoidPush(constT&x)=0;
virtualboolPop(T&x)=0;
virtualboolgetTop(T&x)const=0;
virtualboolIsEmpty()const=0;
virtualboolIsFull()const=0;
virtualintgetSize()const=0;
};
2、顺序栈的类定义、实现与测试:
#include
#include
#include"stdlib.h"
template
classSeqStack{
public:
SeqStack(intsz=50);
~SeqStack(){delete[]elements;};
voidPush(constT&x);
boolPop(T&x);
boolgetTop(T&x)const;
boolIsEmpty()const{return(top==-1)?
true:
false;}
boolIsFull()const{return(top==maxSize-1)?
true:
false;}
intgetSize()const{returntop+1;}
voidMakeEmpty(){top=-1;}
boolInPut();
boolOutPut()const;
private:
T*elements;
inttop;
intmaxSize;
voidoverflowProcess();
};
template
SeqStack:
:
SeqStack(intsz):
top(-1),maxSize(sz){
elements=newT[maxSize];
assert(elements!
=NULL);
};
template
voidSeqStack:
:
overflowProcess(){
intstackIncreament=maxSize;
T*newArray=newT[maxSize+stackIncreament];
if(newArray==NULL){cerr<<"存储分配失败!
"<(1);}
for(inti=0;i<=top;i++)newArray[i]=elements[i];
maxSize=maxSize+stackIncreament;
delete[]elements;
elements=newArray;
};
template
boolSeqStack:
:
Pop(T&x){
if(IsEmpty()==true)returnfalse;
x=elements[top--];
returntrue;
};
template
voidSeqStack:
:
Push(constT&x){
if(IsFull()==true)overflowProcess();
elements[++top]=x;
};
template
boolSeqStack:
:
getTop(T&x)const{
if(IsEmpty()==true)returnfalse;
x=elements[top];
returntrue;
};
template
boolSeqStack:
:
InPut(){
Tval;
cin>>val;
Pop(val);
returntrue;
};
template
boolSeqStack:
:
OutPut()const{
cout<returntrue;
};
测试:
#include
#include"SeqStack.h"
voidmain()
{
SeqStackseq(10);
intm;
for(inti=0;i<5;i++)
{
cout<<"请输入要入栈的一个整数:
";
cin>>m;
seq.Push(m);
//cout<}
intt=seq.getSize();
cout<<"当前栈内共有元素:
"<seq.Pop(m);
t=seq.getSize();
cout<<"执行Pop()后栈内元素个数为:
"<//seq.Push(x);
cout<<"请输入InPut()的val:
";
seq.InPut();
t=seq.getSize();
cout<<"执行InPut()后栈内元素个数为:
"<cout<<"执行OutPut()后栈顶元素为:
";
seq.OutPut();
}
3、链栈的类定义、实现与测试:
#include"SeqStack.h"
template
structLinkNode
{
Tdata;
LinkNode*link;
LinkNode(LinkNode*ptr=NULL){link=ptr;}
LinkNode(Titem,LinkNode*ptr){data=item;link=ptr;}
};
template
classLinkedStack
{
public:
LinkedStack():
top(NULL){}
virtual~LinkedStack(){makeEmpty();};
voidPush(constT&x);
boolPop(T&x);
boolgetTop(T&x)const;
boolIsEmpty()const{return(top==NULL)?
true:
false;}
intgetSize();
voidmakeEmpty();
friendostream&operator<<(ostream&os,SeqStack&s);
private:
LinkNode*top;
};
template
voidLinkedStack:
:
makeEmpty(){
LinkNode*p;
while(top!
=NULL)
{p=top;top=top->link;deletep;}
};
template
voidLinkedStack:
:
Push(constT&x){
top=newLinkNode(x,top);
//assert(top!
=NULL);
};
template
boolLinkedStack:
:
Pop(T&x){
if(IsEmpty()==true)returnfalse;
structLinkNode*p=top;
top=top->link;
x=p->data;
deletep;
returntrue;
};
template
boolLinkedStack:
:
getTop(T&x)const{
if(IsEmpty()==true)returnfalse;
x=top->data;
returntrue;
};
template
intLinkedStack:
:
getSize(){
LinkNode*p=top;intk=0;
while(top!
=NULL)
{top=top->link;k++;}
returnk;
};
template
ostream&operator<<(ostream&os,SeqStack&s){
os<<"栈中元素个数="<LinkNode*p=S.top;inti=0;
while(p!
=NULL)
{os<<++i<<":
"<data<returnos;
};
测试:
#include
#include"LinkedStack.h"
voidmain()
{
LinkedStacklsk;
intx=2;
lsk.Push(x);
x=3;
lsk.Push(x);
intt=lsk.getSize();cout<<"把2和3压栈后链栈内的元素个数为:
"<lsk.makeEmpty();
t=lsk.getSize();
cout<<"清空栈内元素后,栈内元素个数为:
"<cout<<"把1,3,5压栈进入栈内"<x=1;lsk.Push(x);x=3;lsk.Push(x);x=5;lsk.Push(x);
cout<<"依次弹出栈内元素:
"<while(lsk.IsEmpty()==false){
lsk.Pop(x);cout<}
cout<}
4、实现括号匹配:
#include"SeqStack.h"
#include
classkuohao
{
public:
voidPrintMatchedPairs(char*expression){
SeqStacks(50);
charj;
intlength=strlen(expression);
for(inti=1;i<=length;i++){
if(expression[i-1]=='('||expression[i-1]=='['||expression[i-1]=='{')s.Push(expression[i-1]);
elseif(expression[i-1]==')'||expression[i-1]==']'||expression[i-1]=='}'){
if(s.Pop(j)==true)
{
if(expression[i-1]==')'&&j=='(')
{cout<elseif(expression[i-1]==']'&&j=='[')
{cout<elseif(expression[i-1]=='}'&&j=='{')
{cout<}
elsecout<<"没有与第"<"<}
}
while(s.IsEmpty()==false){
s.Pop(j);
cout<<"没有与"<"<}
}
private:
//constintmaxLength=100;
};
测试:
#include
#include"SeqStack.h"
#include"kuohao.h"
voidmain(){
kuohaok;
cout<<"表达式1测试“{[()](())}”:
"<char*e1="{[()](())}";
k.PrintMatchedPairs(e1);
cout<"<char*e2="{[()]]}";
k.PrintMatchedPairs(e2);
}
六、附录
参考《数据结构(用面向对象方法与C++语言描述)》
附上SeqStack.h代码:
#include
#include
#include"stdlib.h"
template
classSeqStack{
public:
SeqStack(intsz=50);
~SeqStack(){delete[]elements;};
voidPush(constT&x);
boolPop(T&x);
boolgetTop(T&x)const;
boolIsEmpty()const{return(top==-1)?
true:
false;}
boolIsFull()const{return(top==maxSize-1)?
true:
false;}
intgetSize()const{returntop+1;}
voidMakeEmpty(){top=-1;}
//voidPrintMatchedPairs(char*expression);
boolInPut();
boolOutPut()const;
private:
T*elements;
inttop;
intmaxSize;
voidoverflowProcess();
};
template
SeqStack:
:
SeqStack(intsz):
top(-1),maxSize(sz){
elements=newT[maxSize];
assert(elements!
=NULL);
};
template
voidSeqStack:
:
overflowProcess(){
intstackIncreament=maxSize;
T*newArray=newT[maxSize+stackIncreament];
if(newArray==NULL){cerr<<"存储分配失败!
"<(1);}
for(inti=0;i<=top;i++)newArray[i]=elements[i];
maxSize=maxSize+stackIncreament;
delete[]elements;
elements=newArray;
};
template
boolSeqStack:
:
Pop(T&x){
if(IsEmpty()==true)returnfalse;
x=elements[top--];
returntrue;
};
template
voidSeqStack:
:
Push(constT&x){
if(IsFull()==true)overflowProcess();
elements[++top]=x;
};
template
boolSeqStack:
:
getTop(T&x)const{
if(IsEmpty()==true)returnfalse;
x=elements[top];
returntrue;
};
template
boolSeqStack:
:
InPut(){
Tval;
cin>>val;
Pop(val);
returntrue;
};
template
boolSeqStack:
:
OutPut()const{
cout<returntrue;
};