定义和特点
- 栈(Stack):限定在表的一端进行插入和删除操作的线性表
- 栈顶(top):允许插入和删除的一端
- 栈底(bottom):表的固定一端
- 空栈:不含数据元素的栈
- 入栈(Push):插入元素
- 出栈(Pop):删除元素
特点
后进先出(LIFO)
顺序栈的基本操作
栈的初始化:Init_Stack(s)
初始条件:栈s不存在
操作结果:构造一个空栈
数据类型定义,结构体
typedef struct{
DataType data[MaxSize];
int top;
}SeqStack;
初始化栈
SeqStack *Init_Stack()
{
SeqStack *s;
s = new SeqStack;
s->top = -1;
return s;
}
判断栈空/栈满:Empty_Stack(s)/Full_Stack(s)
初始条件:栈s存在
操作结果:若s为空栈/栈满,返回1,否则返回0
栈空
int Empty_SeqStack(SeqStack *s)
{
if(s->top == -1)
return 1;
else
return 0;
}
栈满
int Empty_SeqStack(SeqStack *s)
{
if(s->top == MaxSize - 1)
return 1;
else
return 0;
}
入栈 Push_SeqStack(s, x)
初始条件:栈s存在
操作结果:将栈s的栈顶插入一个新元素x,x成为新的栈顶元素
int Push_SeqStack(SeqStack *s, DataType x)
{
if(s->top >= MaxSize - 1) //在栈不满的情况下可以入栈
return 0;
else
{
s->top++;
s->data[s->top] = x;
return 1;
}
}
出栈 Pop_SeqStack(s, x)
初始条件:栈s存在且非空
操作结果:将栈s的栈顶元素从栈中删除
int Pop_SeqStack(SeqStack *s, DataType x)
{
if(Empty_SeqStack(s))
return 0;
else
{
x = s->data[s->top + 1];
s->top--;
return 1;
}
}
读取栈顶元素 GetTop_SeqStack(s, x)
初始条件:栈s存在且非空
操作结果:读栈顶元素,栈不变化
int GetTop_SeqStack(SeqStack *s, DataTye x)
{
if(Empty_SeqStack(s))
return 0;
else
{
x = s->data[s->top];
return 1;
}
}
说明
- 对于顺序栈,入栈时先判断是否为满,栈满时不能入栈,否则出现空间溢出,引起上溢。
- 出栈和读栈顶元素操作,先判断栈是否为空,栈空时不能操作,否则产生错误下溢。通常把栈作为一种控制转移的条件。
补充:判断回文的算法
1234554321就是回文
void Palindroms_SeqStack(char str[], int n)
{
int i;
Init_SeqStack(S1);
for(i = 0; i < n/2; i++)
Push_SeqStack(S1, str[i]);
if(n % 2 != 0)
i++;
while(i < n)
{
Pop_SeqStack(S1, ch);
if(ch != str[i]) //字符不同,直接退出算法
{
printf("The string is not palindrome\n");
return;
}
i++; //字符相同,比较下一个
}
printf("The string is palindrome\n"); //比较字符全部相同,确定是回文
}
链栈的基本操作
链栈的初始化
链栈的数据类型描述
typedef struct node
{
DataType data;
struct node *next;
}StackNode, *LinkStack;
说明
- 若把链栈定义为 LinkStack top,则栈顶元素为:top->data
- 栈空条件:top == NULL,链栈不会满,因为是链表。
链栈的初始化
LinkStack Init_LinkStack()
{
LinkStack top;
top = NULL;
return top;
}
判断链栈为空
int Empty_LinkStack(LinkStack top)
{
if(top == NULL)
return 1;
else
return 0;
}
链栈的入栈
LinkStack Push_LinkStack(LinkStack top, DataType x)
{
StackNode *s;
s = new StackNode; //申请新的节点空间
s->data = x;
s->next = top;
top = s;
return top;
}
链栈的出栈
LinkStack Pop_LinkStack(LinkStack top, DataType *x)
{
StackNode *p;
if(top == NULL)
{
printf("The stack is empty\n");
return 0;
}
else
{
*x = top->data; //保存栈顶元素,指针可随意访问
p = top;
top = top->next; //置新的栈顶指针
delete p; //释放原栈顶元素节点空间
return top; //出栈成功,返回新的栈顶指针
}
}
取链栈栈顶元素
int GetTop_LinkStack(LinkStack top, DataType x)
{
if(top == NULL)
{
printf("The stack is empty\n");
return 0;
}
x = top->data;
return x;
}
计算不带头节点链栈中节点个数的算法
int LsCount(LinkStack s)
{
StackNode *p;
int n = 0;
p = s;
while(p != NULL)
{
n++;
p = p->next;
}
return n;
}