7 栈的表示和操作的实现

顺序栈的表示和实现

利用顺序结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。另设指针base表示栈底元素在顺序栈中的位置。当top和base的值相等时,表示空栈。

#include<iostream>
using namespace std;

//顺序栈的存储结构
#define MAXSIZE 100   //顺序栈存储空间的初始分配量
typedef int SElemType;
typedef struct{
	SElemType *base;  //栈底指针
	SElemType *top; //栈顶指针
	int stacksize;  //栈可用的最大容量
}SqStack;

//初始化
void InitStack(SqStack &S){
	//构造一个空栈
	S.base=new SElemType[MAXSIZE];  //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
	if(!S.base)
		perror("分配失败");
	S.top=S.base;  //top初始化为base 空栈
	S.stacksize=MAXSIZE;  //栈最大容量MAXSIZE
}

//入栈
void Push(SqStack &S,SElemType e){
	//插入元素e为新的栈顶元素
	if(S.top-S.base==S.stacksize)
		perror("栈满");
	*S.top++=e;
}

//出栈
void Pop(SqStack &S,SElemType &e){
	//删除S的栈顶元素,用e返回其值
	if(S.top==S.base)
		perror("栈空");
	e=*--S.top;  //栈顶指针-1,将栈顶元素赋给e
}
//取栈顶元素
SElemType GetTop(SqStack S){
	//返回S的栈顶元素  不修改栈顶指针
	if(S.top!=S.base)   //栈非空
		return *(S.top-1);  //返回栈顶元素的值,栈顶指针不变
	else
		return 0;
}
//遍历整个栈
void StackTraverse(SqStack S){
	SElemType *t=S.top-1;  //指向栈顶元素
	while(t>=S.base){
		cout<<*t<<" ";
		t--;
	}
}

int main(){
	SqStack sqStack;
	InitStack(sqStack);
	int item;
	while(scanf("%d",&item)!=EOF){
		Push(sqStack,item);
	}
	int topN;
	Pop(sqStack,topN);
	printf("%d\n",topN);
	StackTraverse(sqStack);
	return 0;
}
链栈的表示和实现

链表是指采用链表存储结构实现的栈。链栈的结点结构与单链表的结构相同。

#include<iostream>
using namespace std;
typedef int ElemType;
typedef int SElemType;

typedef struct StackNode{
	ElemType data;
	struct StackNode *next;
}StackNode,*LinkStack;

//栈链的初始化
void InitStack(LinkStack &S){
	//构造一个空栈S,栈顶指针置空
	S=NULL;
}
//入栈
void Push(LinkStack &S,SElemType e){
	//在栈顶插入元素e
	StackNode *p=new StackNode;//生成新结点
	p->data=e;
	p->next=S;
	S=p;
}
//出栈
void Pop(LinkStack &S,SElemType &e){
	//删除S的栈顶元素 用e返回其值
	if(S==NULL)
		perror("栈空");
	e=S->data;
	StackNode *p=S;  //用p临时保存栈顶元素空间 以备释放
	S=S->next;  //修改栈顶指针
	delete p; //释放原来
}
//取栈顶元素
SElemType GetTop(LinkStack S){
	if(S!=NULL){
		return S->data;  //返回栈顶元素的值,栈顶指针不变
	}else{
		return -1;
	}
}
//遍历栈所有元素
void StackTraverse(LinkStack S){
	StackNode *p=S;
	while(p!=NULL){
		cout<<p->data<<" ";
		p=p->next;
	}
}

int main(){
	StackNode *stackNode;
	InitStack(stackNode);
	int item;
	while(scanf("%d",&item)!=EOF){
		Push(stackNode,item);
	}
	StackTraverse(stackNode);
	return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuhuimingc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值