栈:只允许在一段进行插入或删除操作。
栈顶:栈中允许进行插入和删除的那一端。
操作特点:后进先出
顺序栈
注:1.top值不能超过最大值max
2.空栈的判定条件通常为top==-1,满栈的判定条件通常为top=max-1,栈中数据元素个数为top+1
顺序栈操作
1.判空:
bool empty(stack s)
{
if(s.top==-1) return true;
else return false;
}
2.进栈:
bool push(stack &S,elemtype x)
{
if(s.top==max-1) return false;
s.data[++top]=x;
return true;
}
3.出栈:
bool pop(stack &S,elemtype &x)
{
if(s.top==-1) return false;
s.data[top--]=x;
return true;
}
4.读取栈顶元素:
bool gettop(stack S,elemtype &x)
{
if(top==-1) return false;
x=s.data[s.top];
return true;
}
共享栈:
栈满条件:指针top1和top2只相差1,即top1+1=top2
结构:
#define max 100
typedef struct a
{
elemtype data[max]; //存放栈顶元素
int top1; //栈1栈顶指针
int top2; //栈2栈顶指针
}sqdouble;
进栈:
栈满条件:指针top1和top2只相差1,即top1+1=top2
bool plus(sqdouble &S , elemtype x , int stacknum)
{
if(s.top+1==s.top2) return false; //栈满
if(stacknum==1) s.data[++s.top1]=x; //栈1有元素进入
if(stacknum==2) s.data[--s.top2]=x; //栈2有元素进入
}
//stacknum 为栈的编号
链式栈
注:可以将头指针作为栈顶指针,所以栈顶放在单链表头部
1.链栈一般不存在栈满的情况
2.空栈的判定条件通常为top==NULL
typedef struct snode
{
elemtype data; //存放栈中元素
struct snode *next; //栈顶指针
}snode ,*slink //链栈的结点
typedef struct linkstack
{
slink top; //栈顶指针
int count; //链栈结点数
}linkstack; //链栈
进栈:
bool push(linkstack *S,elemtype x)
{
slink p=(slink)malloc(sizeof(snode));
p->data=x;
p->next=p; //p的后继指向栈顶元素
s->top=p; //栈顶指针指向新的元素
s->count++; //栈中元素个数加1
return true;
}
出栈:
bool pop(linkstack *S,elemytpe &x)
{
if(s->top==NULL) return false;
x=s->top->data; //栈顶元素值
slink p=s->top; //辅助指针
s->top=s->top->next; //栈顶指针后移
free(p); //释放被删除数据存储空间
s->count--; //栈中元素个数减一
return true;
}