1.栈的定义
一端固定,只允许在另一端插入和删除的线性表,又称堆栈
特殊在操作:操作受限制!
特性:先进后出(first in last out)FILO
后进先出(last in first out)LIFO
1.1基本图示
2.顺序存储结构
2.1定义&初始化
一个stack需要包含:
1)data数组
2)栈顶指针top(说是指针,其实就是栈顶元素在的位置是在数组的第0个还是第1个还是第2个位置)
3)最大范围maxsize
初始化函数:就返回初始化好的栈就可以了
注意top=-1
上面提到的3个元素都要初始化哦~
#include <stdio.h>
#include <stdlib.h>
//1.基于顺序存储结构的实现
#define maxsize 10
struct node
{
int * data;
int top;
int maxsize;
};
typedef struct node * stack;
stack createStack(int maxsize)
{
//申请获得栈空间
stack s=(stack)malloc(sizeof(struct node));
s->data=(int*)malloc(sizeof(int)*maxsize);
s->top=-1;
s->maxsize=maxsize;
//返回这个栈
return s;
}
2.2判断栈满
//判断是否栈满
int isFull(stack s)
{
return (s->top==s->maxsize-1)
}
2.3判断栈空
int isEmpty(stack s)
{
return s->top==-1;
}
2.4入栈
//返回值是int,只是为了标明是否压栈成功,0就是失败,1就是成功
int push(stack s,int x)
{
if(isFull(s)){
printf("栈满");
return 0;
}
else{
s->data[++(s->top)]=x;//这里你必须先让top++,因为初始化是-1
return 1;
}
}
2.5出栈
要返回的就是栈顶元素,也就是取出来栈顶元素!
出栈函数的返回值是int,因为存储元素的类型就是int,
int pop(stack s)
{
if(isEmpty(s)){
printf("栈空");
return 0;
}
else{
return s->data[(s->top)--]//top指向的元素就是栈顶的元素,所以先返回,再让top--
}
}
3.溢出处理-两个栈共享一个数组空间
两个栈共享一个数组空间
3.1定义&初始化
//2.两个栈:共享一个数组空间
struct snode
{
char * data;
int top1;//堆栈1的栈顶指示器
int top2;//堆栈2的栈顶指示器
int maxsize;
};
typedef struct snode* stack;
//初始化
stack createStack(int maxsize)
{
stack s;
//申请栈空间
s=(stack)malloc(sizeof(struct snode));
s->data=(char*)malloc(maxsize*sizeof(char));
s->top1=-1; //栈1置为空
s->top2=maxsize; //栈2置为空
s->maxsize=maxsize;
}
3.2入栈&出栈
//入栈
int push(stack s,char x,int tag)
{
//tag就是区分两个堆栈的标志,tag==1,就是第一个堆栈进行操作
if(s->top2-s->top1==1){
printf("堆栈满\n");
return 0;
}
else{
if(tag==1)
s->data[++(s->top1)]=x;
else
s->data[--(s->top2)]=x;
return 1;
}
}
char pop(stack s,int tag)
{
if(tag==1){
if(s->top1==-1){
printf("堆栈1空\n");
return false;
}
else
return s->data[(s->top1)--];
}
else{
if(s->top2==s->maxsize){
printf("堆栈2空\n");
return false;
}
else
return s->data[(s->top2)++];
}
}