目录
一、链栈
链栈类型定义
typedef struct node
{
int data;
struct node* next;
}LinkStack;
栈顶指针,唯一地确定一个链栈
LinkStack *s;
栈空:s==NULL;
栈的主要运算是在栈顶操作,链表的头部做栈顶,而且不需要附加头结点
进栈操作
void Push(LinkStack *s, int e)
{
LinkStack *p;
p=(LinkStack *)malloc(sizeof(LinkStack));
if(p==NULL)
{
printf("ERROR");
return;
}
else
{
p->data=e;
p->next=s;
s=p;
}
}
出栈操作
void Pop(LinkStack *s, int &e)
{
LinkStack *p;
if(top==NULL)
{
printf("underflow");
return;//函数到此终止
}
else
{
e=s->data;
p=s;
s=s->next;
free(s);
}
}
注:void型函数不能return一个值,但是如果只是return;表示函数到此终止。
二、顺序栈
顺序栈类型定义
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
top指向当前最顶元素的下一个位置
栈空: s.top=s.base;
栈满 s.top-s.base>=s.stacksize;
取栈顶元素
void GetTop(SqStack *s, int &e)
{
if(s.top==s.base)
return;
e=*(s.top-1);
}
入栈
(P22 函数& 疑惑)
void Push(SqStack *s, int e)
{
if(s.top-s.base>=s.stacksize)
{
s.base=(int *)realloc(s.base, (s.stacksize+STACKINCREMENT)*sizeof(int));
if(!s.base) return;
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top=e;
s.top++;
}
注:顺序栈*s对s解引用,注意与链表区别。实际链表中p->data等价于(*p).data;
顺序栈中移动指针可以对指针加减运算
出栈
void Pop(SqStack *s, int &e)
{
if(s.top==s.base) return;
s.top--;
e=*s.top;
}