C语言实现栈的顺序存储与链式存储

实验二 栈

一、实验目的
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);
} 

运行结果
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值