栈的定义
只允许在一端进行插入/删除的线性表
栈顶线性表允许进行插入/删除的那一端
栈底固定的,不允许进行插入/删除的一端
空栈不含任何元素的空表
n个元素有(1/n+1)C2n n种排列个数
栈的顺序存储结构
–增删改查O(1)
初始化
#define MaxSize = 50
typedrf struct {
ElemeType data[MaxSize];
int top;
}SqStack;
空栈条件:S.top==-1
满栈条件:S.top=MaxSize-1
栈长: S.top+1
以下定义中,top指针指向栈顶元素本身
新元素入栈
bool Push (SqStack &S,ElemType x){
if(S.top == MaxSize-1):
reurn false;
else:
S.top = S.top+1;
S.data[S.top]=x;//等价于 S.data[++S.top]=x
return true;
}
出栈
bool popStack(ElemType &x,SqStack &S){
if(S.top == -1)
return false;
else:
x=S.data[S.top -1];//将x指向栈中data=x的元素
S.top =S.top-1;//等价于x=S.data[S.top --]
return true;
}
读栈顶元素
bool GetTop(SqStack &S,ElemType &x){
if(S.top ==-1)
return false;
else:
x = S.data[S.top];
return true;
}
当top指向栈顶元素的下一个元素的时候
进栈操作
bool PushStack(ElemType &x,SqStack &S){
if (S.top ==MaxSize)
return false;
else:
S.data[S.top]=x;
S.top =S.top+1;//等价于S.data[++S.top]=x;
return true;
}
出栈
bool PopStack(ElemeType & x,SqStack & S){
if (S.top ==0):
return false';
S.top = S.top-1;//top指针要指向栈顶元素本素
x=S.data[S.Top];//等价于x=S.data[--S.top]
}
共享栈
让两个顺序栈共享一个数组,数组两端分别作为两个顺序栈的栈底,两个顺序栈向数组中间延展
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int top0;
int top1;
}ShStack;
初始化共享栈
(设top指向栈顶元素
(以下也对应着两端栈判空条件
分别有 top0 和 top1在数组两端
void InitStack(ShStack &S){
S.top0=-1;
S.top1=MaxSize;
}
两端判断满栈的条件
top1-top0==1
top0的栈入栈时
x=S.data[ ++S.top0]
top0出栈时
x=S.data[S.top0 --]
top1的 栈入栈时
x=S.data[–S.top1]
top1的栈 出栈时
x = S.data[++S.top1]
栈的链式存储结构
优点
1.不会出现栈满溢的状况
2.多个栈共享存储空间
3.提高效率
规定用链表实现,且操作都在表头进行,入栈==头插法的链表
Lhead 指的是栈顶元素,此处认为没有头结点
typedef struct Linknode{
ElemeType data;
struct Linknode *next;
}*LiStack;
初始化
bool InitLinkStack(LinkStack & stack){
if(stack==NULL):
return false;
stack->top=NULL;
stack->count=0;
return true;
}
进栈
//压栈:先将压入元素放入到链表表中,然后再将栈顶指针指向压入的元素,然后count+1.
bool push(LinkStack& stack,ElemType e)
{
if (!stack)
{
return false;
}
StackNode* node = (StackNode*)malloc(sizeof(StackNode));
node->next = stack->top; //将元素加入链表中,使node的next指针指向原来的栈顶
node->data = e; //设置node的data
stack->top = node; //设置新的栈顶,栈顶元素指向压入元素
stack->count++; //增加长度
return true;
}
出栈
bool popStack(LinkStack & stack, ElemeType &e){
if(stack ==NULL):
return false;
Stack& node = stack->top;//先定义一个node
& e = node->data; //将e指向node的data
stack->top = node->next; //设置新的top顶元素
free(node); //释放原来的top即node
stack->count--; //将栈的长度-1
return true;
}