1.栈的定义:
在表尾进行插入和删除操作的线性表(仍然满足线性表的操作,只是在push和pop有些区别)
栈顶(top)允许插入和删除,另一端称栈底(bottom),不含任何数据元素的栈叫空栈。
栈:后进先出(last in first out)的线性表,简称LIFO结构。
栈的插入称为进栈,也称压栈,入栈。
栈的删除称为出栈,也称弹栈。
2.栈的抽象数据结构
因为栈本身就是一个线性表,所以线性表的操作特性它都具备,针对它的特殊性,在它的操作上可能会有一些变化。将进栈和出栈分别改名为push和pop。由于栈本身是一个线性表,所以线性表的顺序存储结构和链式存储结构同样适用于栈。
3.栈的顺序存储结构
栈的顺序存储结构,简称顺序栈。定义一个top变量来指示栈定元素在数组中的位置。若存储栈的长度为StackSize,则栈顶位置top必需小于StackSize。下标从0开始,当栈存在一个元素时候,top 等于 0 ,当栈为空栈时候,top 等于 -1。
栈的结构定义
typedef int SElemType;
typedef struct {
SElemType data[MAXSIZE];
int top; //用于栈顶指针
} SqStack;
若现在有一个栈,StackSize为5,则普通栈、空栈、满栈的情况如下图所示。
4.进栈
status pushStack(stack* s ,SElemType e)
{
if(s->top == MaxSize - 1 )
exit(error);
s->top++;
s->data[s->top] = e;
//s->top++;
return OK;
}
5.出栈
status popStack(stack* s )
{
if(s->top == -1)
exit(error);
s->top--; //出栈并不是把这个元素改为0才可以。
}
//栈的顺序存储结构
#include<iostream>
#define MaxSize 10
#define OK 1
#define error -1
using namespace std;
typedef int SElemType;
typedef int status;
typedef struct
{
SElemType data[MaxSize];
int top;
}stack;
//两栈共享空间
typedef struct
{
SElemType data[MaxSize];
int top1;
int top2;
}DoubleStack;
stack* creatStack()
{
stack *stack1 = (stack*)malloc(sizeof(stack));
stack1->top = -1;
return stack1;
}
status pushStack(stack* s ,SElemType e)
{
if(s->top == MaxSize - 1 )
exit(error);
s->top++;
s->data[s->top] = e;
//s->top++;
return OK;
}
status popStack(stack* s )
{
if(s->top == -1)
exit(error);
s->top--; //出栈并不是把这个元素改为0才可以。
}
void printStack(stack* s)
{
while(s->top != -1)
{
//s->data 是栈的首地址
cout<<s->data[s->top]<<endl;
s->top--;
}
}
//两栈共享空间
status pushDoubleStack(DoubleStack *s ,SElemType num ,SElemType insertStack)
{
if(s->top1 + 1 == s->top2)
return error;
if(insertStack!= 1&&insertStack != 2 )
return error;
if(insertStack == 1)
s->data[++s->top1] = num;
else if (insertStack == 2)
s->data[--s->top2] = num;
return OK
} //--和 ->运算等级
status popDoubleStack(DoubleStack *s ,SElemType* e ,SElemType deleteStack)
//SElemType* e 来接受出栈的值 deleteStack从栈1 或者栈2 删除
{
if(deleteStack == 1)
{
//首先进行判断空处理
if(s->top1 == -1)
return error;
*e = s->data[s->top1++];
}
else if(deleteStack == 2)
{
if(s->top2 == MaxSize)
return error;
*e = s->data[s->top2--];
}
return OK;
}
void main()
{
stack *s = creatStack();
pushStack( s ,5 );
printStack(s);
}
栈的链式存储结构称做链栈。
链栈空的定义top == NULL
进栈操作
status pushStackLinkList(StackLinkList* s,eleType e)
{
Stacknode* p = (Stacknode*)malloc(sizeof(Stacknode));
p->data = e;
p->next = s->top;
s->top = p;
s->count++;
return OK;
}
出栈操作
status popStackLinkList(StackLinkList* s,eleType* e)
{
//判断空处理
if(s->top == NULL)
return error;
*e = s->top->data;
Stacknode* p = s->top;
s->top = s->top->next;
free(p);
s->count--;
return OK;
}
栈的应用 ---递归!(没有写代码)