前言
栈和队列是两种重要的线性结构,从数据结构上来看,它们也是线性表。是操作受限的线性表。但从数据类型上来看,则大不相同。
栈(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