实验二 栈
一、实验目的
1.深入了解栈的定义和特性。
2.掌握栈的顺序表示、链表表示以及相应操作的实现,巩固对这两种结构的构造方法的掌握。
3. 会灵活运用栈结构解决某些实际问题。
二、实验内容
1. 栈的基本操作的实现(初始化、赋值、取值、插入、删除等),要求分别采用顺序和链式存储结构。
顺序栈源程序
#include<stdio.h>
#include <process.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int SElemType;
typedef int Status;
typedef struct{//顺序栈的存储结构
SElemType *base;//栈底指针
SElemType *top; //栈顶指针
int stacksize;//栈可用的最大容量
}SqStack;
Status InitStack(SqStack &S)//顺序栈的初始化
{//构造一个空栈S
S.base=new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if(!S.base) exit(OVERFLOW);//存储分配失败
S.top=S.base;//top初始为base,空栈
S.stacksize=MAXSIZE;//stacksize置为栈的最大容量MAXSIZE
return OK;
}
int Assign(SqStack &S,SElemType e)
{
int i,N;
if(S.top-S.base==S.stacksize)return ERROR;//栈满
printf("请输入入栈元素个数");
scanf("%d",&N);
printf("请输入入栈元素");
for(i=0;i<N;i++) {
scanf("%d",&e);
*S.top++=e;
printf("%d已入栈\n",e);
}//元素e压入栈顶,栈顶指针加1
return OK;
}
SElemType GetTop(SqStack S,SElemType &e)//取值
{//返回S的栈顶元素,不修改栈顶指针
if(S.top!=S.base)//栈非空
e=*(S.top-1);//返回栈顶元素的值,栈顶指针不变
printf("栈顶元素为:%d\n",e);
return e;
}
Status Push(SqStack &S,SElemType e)//插入
{//插入元素e为新的栈顶元素
if(S.top-S.base==S.stacksize)return ERROR;//栈满
printf("请输入插入元素");
scanf("%d",&e);
*S.top++=e; //元素e压入栈顶,栈顶指针加1
printf("%d已插入\n",e);
return OK;
}
Status Pop(SqStack &S,SElemType &e)//删除
{//删除S的栈顶元素,用e返回其值
if(S.top==S.base) return ERROR;//栈空
e=*--S.top;//栈顶指针减一,将栈顶元素赋给e
printf("%d已删除\n",e);
return OK;
}
int main(){
SqStack S;
int i;
SElemType e;
if(InitStack(S)) printf("顺序栈初始化成功\n");//初始化
Assign(S,e);//赋值
GetTop(S,e);//取值
Push(S,e);//插入
GetTop(S,e);
Pop(S,e);//删除
GetTop(S,e);
}
运行结果
链栈源程序
#include<stdio.h>
#include <process.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int SElemType;
typedef int Status;
typedef struct StackNode
{//链栈的存储结构
SElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
Status InitStack(LinkStack &S)//链栈的初始化
{// 构造一个空栈S,栈顶指针置空
S=NULL;
return OK;
}
int Assign(LinkStack &S,SElemType e)
{
int i,N;
LinkStack p;
printf("请输入入栈元素个数");
scanf("%d",&N);
printf("请输入入栈元素");
for(i=0;i<N;i++) {
scanf("%d",&e);
p=new StackNode;
p->data=e;
p->next=S;
S=p;
printf("%d已入栈\n",e);
}
return OK;
}
Status Push(LinkStack &S,SElemType e)
{//在栈顶插入元素e
printf("请输入插入元素");
scanf("%d",&e);
LinkStack p;
p=new StackNode;//生成新节点
p->data=e;//将新节点的数据域置为e
p->next=S;//将新节点插入栈顶
S=p;//修改栈顶指针为p
printf("%d已插入\n",e);
return OK;
}
Status Pop(LinkStack &S,SElemType &e)
{//删除S的栈顶元素,用e返回其值
LinkStack p;
if(S==NULL) return ERROR;//栈空
e=S->data;//将栈顶元素赋给e
p=S;//用p临时保存栈顶元素空间,以备释放
S=S->next;//修改栈顶指针
delete p;//释放原栈顶元素的空间
printf("%d已删除\n",e);
return OK;
}
SElemType GetTop(LinkStack S,SElemType &e)
{//返回栈顶元素的值,不修改栈顶指针
if(S!=NULL)//栈非空
e=S->data;//返回栈顶元素的值,栈顶指针不变
printf("栈顶元素为:%d\n",e);
return e;
}
int main(){
LinkStack S;
SElemType e;
if(InitStack(S)) printf("链栈初始化成功\n");//初始化
Assign(S,e);//赋值
GetTop(S,e);//取值
Push(S,e);//插入
GetTop(S,e);
Pop(S,e);//删除
GetTop(S,e);
}
运行结果