C++面试题中很大一个板块——数据结构,主要包括线性表、栈、队列、字符串、二叉树等等,今天我们说说栈。
一、概念
栈是限定性线性表,限制在表的一端进行插入和删除的线性表。允许插入、删除的一端称为栈顶,栈顶的当前位置是动态变化的,只能在栈顶对栈进行操作;不允许插入、删除的另一端称之为栈底,栈底是固定不变的,当表中没有元素时称为空栈。栈的特性是先进后出。栈的存储方式有两种:顺序存储结构和链式存储结构。
二、顺序存储结构
用一组连续的存储单元依次存放自栈底到栈顶的数据元素,设一个位置指针top(栈顶指针)动态指示栈顶元素在顺序栈中的位置。数据元素可以是任意类型的数据,但所有的数据元素必须是同一种类型。top=-1 表示空栈。
1.存储结构
typedef int SElemType; //变量类型
#define STACK_SIZE 100 //栈的初始大小
typedef struct SeqStack
{
SElemType data[STACK_SIZE];
int top;
}SeqStack, *pSeqStack;
2.初始化栈
void Init_SeqStack(SeqStack *stack)
{
stack->top = -1;
}
3.判断栈是否为空
bool IsEmpty_SeqStack(SeqStack *stack)
{
if(stack->top == -1)
{
return true;
}else
{
return false;
}
}
4.判断栈是否为满
bool IsFull_SeqStack(SeqStack *stack)
{
if(stack->top == STACK_SIZE-1)
{
return true;
}else
{
return false;
}
}
5.进栈运算
bool Push_SeqStack(SeqStack *stack, SElemType value)
{
if(IsFull_SeqStack(stack))
{
return false;
}
stack->top++;
stack->data[stack->top] = value;
return true;
}
6.出栈运算
bool Pop_SeqStack(SeqStack *stack, SElemType *value)
{
if(IsEmpty_SeqStack(stack))
{
return false;
}
*value = stack->data[stack->top];
stack->top--;
return true;
}
7.返回栈顶元素
int GetTop_SeqStack(SeqStack *stack)
{
if(IsEmpty_SeqStack(stack))
{
return -1;
}else
{
return stack->data[stack->top];
}
}
二、链式存储结构
采用带头结点的单链表实现链栈。头指针top就作为栈顶指针,始终指向当前栈顶元素前面的头结点。
若top->next=NULL,则代表空栈。
1.存储结构
typedef int SElemType; //变量类型
typedef struct LinkStackNode
{
SElemType data;
struct LinkStackNode *next;
}LinkStackNode, *pLinkStackNode;
2.初始化栈
void Init_LinkStack(LinkStackNode *stack)
{
if(stack)
{
stack->next = NULL;
}
}
3.销毁栈
void Destroy_LinkStack(LinkStackNode *stack)
{
LinkStackNode *p, *q;
if(stack != NULL)
{
p = stack;
while(p->next != NULL)
{
q = p->next;
p->next = p->next->next;
free(q);
}
}
stack = NULL;
}
4.判断栈是否为空
bool IsEmpty_LinkStack(LinkStackNode *stack)
{
if(stack->next == NULL)
{
return true;
}else
{
return false;
}
}
5.进栈运算
bool Push_LinkStack(LinkStackNode *stack, SElemType value)
{
LinkStackNode *stackNode;
stackNode = (LinkStackNode*)malloc(sizeof(LinkStackNode));
stackNode->data = value;
stackNode->next = stack->next;
stack->next = stackNode;
return true;
}
6.出栈运算
bool Pop_LinkStack(LinkStackNode *stack, SElemType *value)
{
if(IsEmpty_LinkStack(stack))
{
return false;
}
LinkStackNode *stackNode , *p;
p = stack;
stackNode = p->next;
p->next = p->next->next;
*value = stackNode->data;
free(stackNode);
return true;
}
7.返回栈顶元素
int GetTop_LinkStack(LinkStackNode *stack)
{
if(IsEmpty_LinkStack(stack))
{
return -1;
}else
{
return stack->next->data;
}
}