数据结构 实验二 栈队列算法设计Word下载.docx
《数据结构 实验二 栈队列算法设计Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构 实验二 栈队列算法设计Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
//存储空间分配增量
typedefstruct{
int*base;
//在构造之前和销毁之后,base的值为NULL
int*top;
//栈顶指针
intstacksize;
//当前已分配的存储空间,以元素为单位
}SqStack;
voidInitStack(SqStack&
S){
//构造一个空栈S
S.base=(int*)malloc(STACK_INIT_SIZE*sizeof(int));
if(!
S.base)
exit(0);
//存储分配失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
//cout<
<
"
初始化完毕"
endl;
}//InitStack
voidGetTop(SqStackS,int&
e){
//若栈不空,则用e返回S的栈顶元素,并返回OK;
否则返回ERROR
if(S.top==S.base)
{cout<
此栈为空!
!
}
e=*(S.top-1);
cout<
e<
//cout<
取值结束"
}//GetTop
voidPush(SqStack&
S,inte){
//插入元素e为新的栈顶元素
if(S.top-S.base>
S.stacksize){//栈满,追加存储空间
S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
新分配空间失败!
!
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
*S.top++=e;
插入元素成功"
}//Push
voidPop(SqStack&
S,int&
//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;
if(S.base==S.top)
此栈为空栈,无法删除!
e=*--S.top;
删除成功!
}//Pop
voidClearStack(SqStack&
//把S置为空栈
cout<
此栈已经为空!
}//ClearStack
voidmain(){
SqStackStack;
intm,n,x,y,z,i=0;
InitStack(Stack);
请输入您要建立的栈的大小:
cin>
>
n;
Stack.stacksize=n;
do{
请选择操作:
"
1,进栈2,出栈3,查看栈顶值4,清空栈5,退出"
m;
switch(m){
case1:
请输入进栈值:
cin>
z;
if(i==Stack.stacksize)
{
cout<
Sorry!
endl<
栈溢出!
此程序将退出!
exit(0);
}
Push(Stack,z);
i++;
break;
case2:
Pop(Stack,x);
x<
出栈"
case3:
栈顶值为:
GetTop(Stack,y);
case4:
ClearStack(Stack);
case5:
Exit!
default:
输入错误!
此程序将退出!
}//switch
}while(m!
=5);
getch();
}
2.#include<
iomanip.h>
//链式栈
typedefstructStack{
Stack*next;
intdata;
}Stack,*SLink;
SLinktop;
intlength;
//构造一个空栈
S.top=NULL;
//设栈顶指针的初值为"
空"
S.length=0;
//空栈中元素个数为
//在栈顶之上插入元素e为新的栈顶元素
SLinkp;
p=newStack;
//建新的结点
p->
data=e;
next=S.top;
S.top=p;
++S.length;
//若栈不空,则删除S的栈顶元素,用e返回其值
S.top)
此栈为空栈!
e=S.top->
data;
S.top=S.top->
next;
voidGetTop(SqStack&
//若栈不空,取栈顶元素,用e返回其值
此栈为空栈!
//
//需改正!
if(i==n)
//队空、入队和出队
intn=0;
typedefstructQ{
Q*next;
}Q,*QLink;
voidInitQ(QLink&
q){
//构造一个队列
q->
next=q;
}//InitQ
voidPush(QLink&
q,int&
//入队
QLinkp;
p=newQ;
next=q->
next=p;
n++;
voidOutQ(QLink&
//出队
QLinkt;
t=newQ;
p=q;
inti;
for(i=0;
i<
=n;
i++){
if(p->
next->
data==e)
{
t=p->
p->
next=t->
deletet;
break;
}//if
p=p->
}//for
if(i==(n+1)){
您所输入的值不存在!
}//OutQ
voidClearQ(QLink&
//置队空
q=q->
}//ClearQ
voidcheckQ(QLink&
//查看队尾元素
if(q->
next==q){
此队列为空!
程序将退出!
e=q->
}//check
intm,x,n,y;
QLinkQu;
Qu=newQ;
InitQ(Qu);
1,入队2,出队3,查看队尾元素4,清空队列5,退出"
x;
switch(x){
请输入您想插入的值:
\t"
;
Push(Qu,m);
请输入您想出队的值:
OutQ(Qu,n);
n<
出队"
checkQ(Qu,y);
队尾元素为:
y<
}while(x!
getch();
iostream>
string>
usingnamespacestd;
boolcomp(charx,chary){
if(x==y)
returntrue;
else
returnfalse;
}//comp
charstr[100];
请输入字符串:
str;
inti=0,m;
while(str[i]){
m=i%2;
if(m){
intp=i-1,q=0;
intj;
for(j=0;
j<
(i-1)/2;
j++){
if(!
comp(str[q++],str[p--]))
break;
}//for
if(j==(i-1)/2)
此字符串对称!
else
此字符串不对称!
}//if
else{
(i/2);
if(j==i/2)
}//else
五、运行结果
1.
六、实验体会
栈和队列是数据结构里面很重要的两种特殊线性结构,它们的操作不同于线性表,其运算(插入和删除)是受限制的。
栈的所有插入和删除操作都限制在表的同一端进行,其最先插入的元素被压在栈的底部,要到所有后插入的元素全部被删除后才能删除。
记住了原理,程序就好办了。
教师评价
优
良
中
及格
不及格
教师签名
日期