堆栈的链式表示操作
堆栈是一种限定在同一端进行插入和删除操作的线性结构
允许执行插入和删除的这一 端称为栈顶(top),另一端为栈底
堆栈有两种存储结构,顺序栈和链式栈
以下为链式栈的操作代码
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
//定义堆栈单链表
typedef struct node
{
ElemType elem;
struct node *next;
}Node;
typedef struct stack
{
Node *top,*pRear;
//int top;
}Stack;
//初始化创建
int Init(Stack *S)
{
Node *p = (Node*)malloc(sizeof(Node));
S->top = p;
S->pRear = p;
p->next = NULL;
printf("堆栈创建成功!\n");
return 1;
}
int IsEmpty(Stack *S)
{
return (S->top == S->pRear) ;
}
//插入栈顶元素
int Push(Stack *S,ElemType x)
{
Node *p=(Node*)malloc(sizeof(Node));
p->elem = x;
p->next = S->top;
S->top = p;
printf("成功入栈!\n");
}
//删除栈顶元素
int Pop(Stack *S)
{
Node *p = S->top;
if(IsEmpty(S)) return 0;
S->top = p->next;
free(p);
printf("成功出栈!\n");
return 1;
}
//撤销堆栈
void Destory(Stack *S)
{
Node *p,*q;
p = S->top;
q = NULL;
while(p != S->pRear)
{
q = p->next;
free(p);
p = q;
}
printf("堆栈已撤销!\n");
}
//输出
void Output(Stack *S)
{
if(IsEmpty(S))
{
printf("栈为空!\n");
}
Node *p = S->top;
printf("输出栈:");
while(p != S->pRear)
{
printf("%d ",p->elem);
p =p->next;
}
printf("\n");
}
int main(void)
{
Stack s;
Init(&s);
for(int i=0;i<5;i++)
Push(&s,i);
Output(&s);
Pop(&s);
Output(&s);
Destory(&s);
return 0;
}