【数据结构】栈和队列

前言

栈和队列是两种重要的线性结构,从数据结构上来看,它们也是线性表。是操作受限的线性表。但从数据类型上来看,则大不相同。

栈(Stack)

定义

书本定义:

栈是限定仅在表尾进行插入或删除操作的线性表。表尾称为栈顶,表头称为栈底。不含元素的空表称为空栈。

《大话数据结构》的定义:
在这里插入图片描述
在这里插入图片描述

栈的表示和实现

两种存储表示方法:栈的顺序存储表示----顺序栈 栈的链式表示-----链栈
我们以顺序栈为例子进行栈的表示和实现

栈的顺序存储表示

typedef struct{
   
	char *base;//栈底指针
	char *top;//栈顶指针
	int stacksize;//当前已分配的存储空间
}SqStack;

栈的初始化

#define SIZE 100;//存储空间初始分配量
int init(SqStack &s){
   
	s.base=(char*)malloc(SIZE*sizeof(char));
	if(!s.base)//开辟存储空间失败则停
		exit(0);
	s.stacksize=100;
	s.top=s.base;
	return 1;
}

元素进栈

void push(SqStack &s,char e){
   
//首先判断栈是否满,若满了,则需要申请新的存储空间
	if(s.top-s.base>=s.stacksize){
   
	//指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小),返回调整之后的空间的起始位置地址
		s.base=(char *)realloc(s.base,(s.stacksize+10)*sizeof(char));
		s.top=s.base+s.stacksize;
		s.stacksize+=10;
}
	*s.top++=e;//将值赋给s.top指向的位置,s.top++ 
}

输出出栈序列

void Out(SqStack &s){
   
	if(s.top!=s.base)
		printf("%c ",s.top);
		s.top++;
}

释放栈

int Clear(SqStack &s){
   
	if(!s.base)
		return 0;
	free(s.base);//释放内存空间
	s.base=NULL;
	s.top=NULL;
	s.stacksize=0;
	return 1;
}

完整代码如下:

//栈的基本操作
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define SIZE 100
#define CREAT 10;
typedef struct{
   
char *base;
char *top;
int stacksize;
}SqStack;
//初始化栈 
int initstack(SqStack &s){
   
s.base=(char *)malloc(SIZE*sizeof(char));
if(!s.base)
exit(0);
s.stacksize=SIZE;
s.top=s.base ;
return 1;
}
//判断栈s是否非空
void isempty(SqStack &s){
   
if(s.top==s.base)
printf("该栈是空的\n");
else
printf("该栈不是空的\n");
}
//依次进栈元素 a,b,c,d,e
void Push(SqStack &s,char e){
   
if(s.top-s.base >=s.stacksize ){
   
s.base=(char*)realloc(s.base,(s.stacksize+10)*sizeof(char));
s.top=s.base+s.stacksize;
s.stacksize+=10;
  }
*s.top++=e;//将值赋给s.top指向的位置,s.top++ 
}
//输出栈的长度
int StackLength(SqStack s){
   
return s.top-s.base ;
}
//输出从栈顶到栈底元素
void StackTraverse(SqStack &s){
   
while(s.b
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值