题目要求:
1、设栈采用顺序存储结构(用动态数组),请编写栈的各种基本操作的实现函数,并存放在头文件test7.h中。同时建立一个验证操作实现的主函数文件test7.cpp,编译并调试程序,直到正确运行。
提示:
⑴ 栈的动态数组顺序存储结构可定义如下:
struct Stack {
ElemType *stack ; // 存栈元素
int top; // 栈顶指示器
int MaxSize; // 栈的最大长度
};
⑵ 栈的基本操作可包括:
① void InitStack (Stack &S); //构造一个空栈 S
② int EmptyStack (Stack S); //若栈S为空栈返回1,否则返回0
③ void Push(Stack &S, ElemType item); //元素 item进栈
④ ElemType Pop(Stack &S); //栈S的栈顶元素出栈并返回
⑤ ElemType Peek(Stack S); //取栈S的当前栈顶元素并返回
⑥ void ClearStack (Stack &S); //清除栈s,使成为空栈
2、应用:写一函数,判断给定的字符串是否中心对称。如字符串“abcba”、“abccba”均为中心对称,字符串“abcdba”不中心对称。要求利用test7.h中已实现的有关栈的基本操作函数来实现。请把该函数添加到文件test7.cpp中的主函数前,并在主函数中添加相应语句进行测试。函数原型如下:
int IsReverse(char *s) //判断字符串S是否中心对称,是返回1,否则返回0
Test7.h的代码如下:
struct Stack {
ElemType *stack ; // 存栈元素
int top; // 栈顶指示器
int MaxSize; // 栈的最大长度
};
void InitStack (Stack &S) //初始化堆栈
{
S.MaxSize=10;
S.stack=(ElemType *) malloc(S.MaxSize *sizeof(ElemType)); //申请动态空间
if (!S.stack) { //假如空间分配失败
cerr<<"动态分配失败!"<<endl;
exit(1);
}
S.top=-1; //栈顶指示
}
int EmptyStack (Stack S) //判断是否是空栈
{
return S.top == -1;
}
void Push(Stack &S, ElemType item) //把元素压入堆栈
{
if(S.top == S.MaxSize-1){ //若栈满,扩大两倍空间
S.stack = (ElemType *) realloc( S.stack, 2*S.MaxSize*sizeof(ElemType) ); //继续申请空间
S.MaxSize= 2*S.MaxSize;
}
S.top ++;
S.stack[S.top ] = item;
}
ElemType Pop(Stack &S) //栈S的栈顶元素出栈并返回
{
if (S.top==-1)
{
cerr<<"栈已空无数据元素出栈!"<<endl;
exit(1);
}
S.top--;
return S.stack[S.top+1];
}
ElemType Peek( Stack S ) //取栈S的当前栈顶元素并返回
{
if (S.top==-1) //栈已空
{
cerr<<"栈已空无数据元素出栈!"<<endl;
exit(1);
}
return S.stack[S.top];
}
void ClearStack( Stack &S ) //销毁堆栈
{
if (S.stack)
{
free(S.stack); //释放空间
S.stack = NULL;
}
S.top = -1;
S.MaxSize = 0;
}
Test7.cpp 的代码如下:
#include <iostream.h>
#include <stdlib.h>
typedef char ElemType;
#include "test7.h"
int IsReverse(char *s)
{
Stack t;
InitStack(t); //初始化堆栈
int i,j,res=1,x=0;
while(s[x]!='\0'){
x++;
if(EmptyStack(t))
for(j=0;j<x;j++)
Push(t,s[j]);
}
cout<<"出栈字符为:"<<Peek(t)<<endl;
for(i=0;i<x/2;i++){
if(s[i]==Pop(t))
continue;
else{
res=0;
break;
}
return res; //返回标志
}
ClearStack(t);
}
void main()
{
char a[80]; //定义数组
int i=0;
cout<<"输入字符串,以#为结束:"<<endl;
cin>>a[0];
while(a[i]!='#'){
i++;
cin>>a[i]; //输入线性表
}
a[i]='\0'; //线形表末尾
if(IsReverse(a))
cout<<"字符串中心对称"<<endl;
else
cout<<"字符串非中心对称"<<endl;
}
分享到:
相关推荐
数据结构课程作业,堆栈的基本操作,如出栈、入栈、取栈顶元素等
堆栈的基本操作1.学习堆、队列。 2.完成两种存储结构的相关函数。 3.利用堆、队列解决实际问题。 问题描述: 1.学习堆、队列。 2.完成两种存储结构的相关函数。 3.利用堆、队列解决实际问题。 代码具有正确性、健壮...
数据库与数据结构课程 堆栈链表与队列链表的基本操作函数,还有可供参考的可执行文件exe
兰州理工大学 数据机构 堆栈(包括顺序结构、链式结构)和队列的基本操作:初始化栈、判断栈空、出栈、入栈等运算
大量的数据结构代码例题 堆栈 树 连表 字符串 基本操作 程序员笔试必备的东西
堆栈和队列基本操作的编程实现(2学时,验证型),掌握堆栈和队列的建立、进栈、出栈、进队、出队等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。也鼓励学生利用基本操作进行一些...
堆栈的创建,出栈,入栈等操作。经过编译可直接使用。
堆栈及静态数据区详解
先定义堆栈的几个基本操作,再设计一主函数利用堆的操作完成以下功能:假设一个算术表达式中可以包含三种括号:()[]{},且这三种括号可以按任意次序嵌套使用(如:...[...{...}...[...]...]...(...))。编写判别给定...
数据结构实验:堆栈与队列; 包括3个代码和实验报告: 括号匹配完成、 利用栈队列逆置 、栈的操作
数据结构实验 堆栈或队列基本操作的编程实现
数据结构课程实验实训报告--堆栈和队列的基本操作。.doc
中国大学MOOC上浙大的《数据结构》课程堆栈链式存储实现的代码,包括空栈的创建,入栈、出栈等基本操作
【源代码】C++实现严蔚敏数据结构所有算法(三)堆栈(VS2017)
单链表操作 和 栈、队列的应用 基本要求:1)用前插法建立带表头结点的单链表; 2)在该链表中统计数据值为x的结点个数。 3)在该链表中值为k的结点前插入y结点,并删除k结点,如果没有值为k的结点则把y结点插在...
把堆栈和队列的顺序存储(环队)和链表存储的数据进队、出队等运算其中一部分进行程序实现。可以实验一的结果自己实现数据输入、数据显示的函数。
◆ 了解堆栈缓冲区溢出的基本原理及其危害。 ◆ 体会远程缓冲区溢出的常见攻击手法。 ◆ 树立安全编程的思想,从根本上杜绝缓冲区溢出的发生。 [实验环境] ◆ 网络:局域网环境。 ◆ 远程计算机 ◇ 操作系统:...
定义了堆栈的9个基本操作函数,并利用堆栈数据结构解迷宫问题。
使用链表和堆栈,通过将结构体指针作为堆栈数据,简单明了的实现后缀式转前缀式
栈和队列的基本操作实现及其应用(报告),这是我们学习数据结构的时候老师给的实验我写的实验报告,给大家参考一下!