1. 认识堆栈
- 堆栈是一种特殊的数据结构,只在一端做输入、输出,即入栈、出栈
- 特点:后入先出
对堆栈的基本操作如下
Stack CreateStack(int MaxSize)
建立一个空栈int IsFull(Stack S,int MaxSize)
判断该栈是否已满void Push(Stack S,ElementType item)
执行入栈操作,即将元素item压入栈中int IsEmpty(Stack S)
判断该栈是否为空ElementType Pop(Stack S)
执行出栈操作,即将栈顶元素移出栈
2. 堆栈的顺序存储实现
2.1 栈结构体类型
- 栈的顺序存储结构通常由一个一维数组和一个记录栈顶元素位置的变量元素组成
- 用数组表示堆栈时, top=-1表示栈为空 ;top=SIZE-1 表示栈满
typedef struct snode{
int Data[SIZE];
int Top;
}Stack;
2.2 入栈操作
void Push(Stack *S,int item )
{
if(S->Top==SIZE-1)
{
printf("该栈已满\n");
return;
}
else
{
S->Data[++(S->Top)]=item;
return;
}
}
2.3 出栈操作
int Pop(Stack* S)
{
if(S->Top==-1)
{
printf("栈空\n");
return ERROR;
}
else
return S->Data[(S->Top)--];
}
2.4 用一个数组表示两个堆栈
- 方案:两个堆栈分别从数组的两头开始向中间生长;
- 栈满标志:当两个栈的栈顶指针相遇时,即Top2 - Top1 = 1时,表示两个栈都满了
程序实现入栈出栈
typedef struct dsnote{
int Data[SIZE];
int Top1;
int Top2;
}D_Stack;
void D_Push(D_Stack *S,int item,int tag)
{
if(S->Top2-S->Top1==1)
{
printf("该栈满\n");
return;
}
else
{
if(tag==1)
S->Data[++(S->Top1)]=item;
if(tag==2)
S->Data[--(S->Top2)]=item;
return;
}
}
int D_Pop(D_Stack *S,int tag)
{
if(tag==1)
{
if(S->Top1==-1)
{
printf("栈1空");
return ERROR;
}
else
return S->Data[(S->Top1)--];
}
if(tag==2)
{
if(S->Top2==SIZE)
{
printf("栈2空");
return ERROR;
}
else
return S->Data[(S->Top2)++];
}
}
3.堆栈的链式存储实现
3.1栈结构体
typedef struct Snode {
int Data;
struct Snode *Next;
}Stack;
3.2 栈的操作
Stack* Creat_Stack()
{
Stack *head=(Stack*)malloc(sizeof(Stack));
head->Next=NULL;
return head;
}
int IsEmpty_Stack(Stack*s)
{
if(s->next==NULL)
return 1;
else
return 0;
}
void Push_Stack(Stack* s,int item)
{
Stack* p=(Stack*)malloc(sizeof(Stack));
p->Data=item;
p->Next=s->Next;
s->Next=p;
}
int Pop_Stack(Stack* s)
{
if(IsEmpty_Stack(s))
{
printf("栈空\n");
return ERROR;
}
else
{
int num;
Stack*p =s->Next;
num=p->Data;
s->Next=p->Next;
free(p);
return num;
}
}