栈
栈是限定仅在表尾进行插入和删除操作的线性表。栈相当于一个箱子,满足先进后出的原则。
c语言定义栈
typedef struct node
{
int data;
struct node *next;
}node,*pNode;
struct stack
{
pNode pTop;//指向栈顶
pNode pBottom;//指向栈底
}stack,*pStack;
栈的基本操作
(1)初始化,建立一个空栈
void init(stack *ps)
{
ps->pTop = (pNode)malloc(sizeof(node));//top指向了一个新分配的空间,即栈的"头"
if (NULL == ps->pTop)
{
printf("内存分配失败!\n");
exit(-1);
}
ps->pBottom = ps->pTop;
ps->pTop->next = NULL;
return;
}
算法:
(1)新建一个栈的节点即栈的“头”,使栈顶指向头
(2)栈底和栈顶指向同一位置,将栈顶赋给栈底
(3)使头的指针域指向空
(2)进栈
bool push(stack *ps, int val)
{
pNode pNew = (pNode)malloc(sizeof(node));
if (NULL == pNew)
{
printf("动态内存分配失败!\n");
exit(-1);
}
pNew->data = val;
pNew->next = ps->pTop;//注意是top不是top->next
ps->pTop = pNew;//注意是top不是top->next
return true;
}
算法:
(1)开辟新节点空间
(2)将要添加的数值放在新节点数据域
(3)让新节点指针域指向之前top指向的节点
(4)让top指向新节点
(3)出栈
bool pop(stack *ps)
{
if (is_empty(ps))
return false;
pNode p = ps->pTop;
ps->pTop = p->next;
free(p);
p = NULL;
return true;
}
算法:
(1)确保栈不为空
(2)新建一个指针变量将top的值赋给它
(3)top的指向的位置下移一个
(4)释放p
(4)遍历
void traverse(stack * ps)
{
pNode p = ps->pTop;//先进的后出
while (p != ps->pBottom)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
return;
}
(5)删除
void clear(stack *ps)
{
if (is_empty(ps))
return;
pNode p = ps->pTop;
pNode q = NULL;
while (p != ps->pBottom)
{
q = p->next;
free(p);
p = q;
}
ps->pTop = ps->pBottom;
return;
}
算法
(1)判断栈是否为空
(2)设置两个指针变量,一个变量指向要删除的元素,另一个变量指向要删除与元素的下一个元素,每次循环将q的值赋给p
(3)最后使top和bottom都指向头