一、何为堆栈?
????a.堆栈是一种特殊的线性表 ????b.堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其不同点是:线性表允许在任意位置插入和删除数据元素,但堆栈只允许在固定一端进行插入和删除数据元素,所以栈又称为“先进后出”(FILO)或“后进先出”(LIFO)的线性表 ????c.堆栈中允许进行插入和删除数据元素的一端称为栈顶,另一端称为栈底 ????d.堆栈的插入操作通常称为进栈或入栈;堆栈的删除操作通常称为出栈或退栈
二、思维导图
三、代码
1、顺序堆栈
#include <stdio.h>
typedef int DataType;
#define MaxStackSize 64
typedef struct
{
DataType stack[MaxStackSize];
int top;
}SeqStack;
void StackInit(SeqStack *S)
{
S->top = 0;
}
int StackIsEmpty(SeqStack S)
{
if (S.top <= 0)
return 0;
else
return 1;
}
int StackPush(SeqStack *S, DataType x)
{
if (S->top >= MaxStackSize)
{
printf("栈满,无法进栈!!!\n");
return 0;
}
else
{
S->stack[S->top] = x;
S->top++;
return 1;
}
}
int StackPop(SeqStack *S, DataType *x)
{
if (S->top <= 0)
{
printf("堆栈已空,无法出栈!!!\n");
return 0;
}
else
{
S->top--;
*x = S->stack[S->top];
return 1;
}
}
int StackGetTop(SeqStack S, DataType *x)
{
if (S.top <= 0)
{
printf("堆栈已空!!!\n");
return 0;
}
else
{
*x = S.stack[S.top - 1];
return 1;
}
}
int main()
{
SeqStack myStack;
int i, x;
StackInit(&myStack);
for (i = 0; i < 10; i++)
StackPush(&myStack, i + 1);
StackGetTop(myStack, &x);
printf("当前栈顶元素为:%d\n", x);
printf("依次出栈:");
while (StackIsEmpty(myStack))
{
StackPop(&myStack, &x);
printf("%d ", x);
}
system("pause");
return 0;
}
2、链式堆栈
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
typedef struct snode
{
DataType data;
struct snode *next;
}LSNode;
void StackInit(LSNode **top)
{
*top = (LSNode *)malloc(sizeof(LSNode));
(*top)->next = NULL;
}
int StackIsEmpty(LSNode *top)
{
if (top->next == NULL)
return 0;
else
return 1;
}
void StackPush(LSNode *top, DataType x)
{
LSNode *p;
p = (LSNode *)malloc(sizeof(LSNode));
p->data = x;
p->next = top->next;
top->next = p;
}
int StackPop(LSNode *top, DataType *x)
{
LSNode *p = top->next;
if (p == NULL)
{
printf("堆栈已空,删除错误!!!\n");
return 0;
}
top->next = p->next;
*x = p->data;
free(p);
return 1;
}
int StackGetTop(LSNode *top, DataType *x)
{
LSNode *p = top->next;
if (p == NULL)
{
printf("堆栈已空,取出错误!!!\n");
return 0;
}
*x = p->data;
return 1;
}
void StackDestroy(LSNode **top)
{
LSNode *p, *q;
p = *top;
while (p != NULL)
{
q = p;
p = p->next;
free(q);
}
*top = NULL;
}
int main()
{
int i, x;
LSNode *top;
StackInit(&top);
for (i = 0; i < 10; i++)
StackPush(top, i + 1);
StackGetTop(top, &x);
printf("当前栈顶元素为%d\n", x);
printf("依次出栈:");
while (StackIsEmpty(top))
{
StackPop(top, &x);
printf("%4d", x);
}
StackDestroy(&top);
system("pause");
return 0;
}
|