一 栈的定义:
栈(堆栈)是一种线性表,它的特点是仅允许在栈的一端进行插入、删除等操作。栈底固定,栈顶浮动。其特性为后进先出。一般栈中元素为0时,称为空栈。它有两种实现方式,顺序栈与链栈,下面将简单的说明一下顺序栈及链栈的生成与简单操作。
栈的简单操作如图所示:(top从0到3的改变体现着入栈与出栈)
二 顺序栈:
顺序栈:静态栈,以顺序表的方式实现栈以及栈的简单操作。顺序栈的模型为:
顺序栈的见到操作的具体代码如下所示:
头文件:
#include<stdio.h>
#include<assert.h>
#include<windows.h>
typedef int SDataType;
typedef struct Stack {
SDataType array[100];
int top;
//此处的array[top]表示下一个可用位置
//此处的array[top-1]表示栈顶元素位置
//top表示栈里现在有多少数据
} Stack;
// 初始化
Stack* StackInit(Stack *pStack);
// 压栈
void StackPush(Stack *pStack, SDataType data);
// 出栈
void StackPop(Stack *pStack);
// 返回栈顶元素
SDataType StackTop(Stack *pStack);
// 判断是否为空
// 1 空
// 0 不空
int StackIsEmpty(Stack *pStack);
// 返回数据个数
int StackSize(Stack *pStack);
//打印栈
void StackPrint(Stack *pStack);
// 初始化
Stack* StackInit(Stack *pStack)
{
//Stack * pStack1 = (Stack *)malloc(sizeof(Stack));
//assert(pStack1 != NULL);//确定栈创建成功,如果pStack == NULL,整个程序直接退出
pStack->top = 0;//栈里的数据个数为0
return pStack;
}
// 压栈
// 压栈就是让栈顶元素等于所要入栈的元素,再让top++;(前提条件是栈未满)
void StackPush(Stack *pStack, SDataType data)
{
assert(pStack != NULL);
assert(pStack->top < 100);
pStack->array[pStack->top] = data;
pStack->top++;
}
// 出栈
// 出栈的前提是栈里有元素,然后只需要让栈顶指针减减
void StackPop(Stack *pStack)
{
assert(pStack != NULL);
assert(pStack->top >0);
pStack->top--;
}
// 返回栈顶元素
// 前提是栈中有元素,需要将栈顶指针减减
int StackTop(Stack *pStack)
{
assert(pStack != NULL);
assert(pStack->top > 0);
pStack->top--;
return(pStack->array[pStack->top]);
}
// 判断是否为空
// 1 空
// 0 不空
int StackIsEmpty(Stack *pStack)
{
assert(pStack != NULL);
if (pStack->top == 0)
return 1;
else
return 0;
}
// 返回数据个数
int StackSize(Stack *pStack)
{
assert(pStack != NULL);
pStack->top++;
return (pStack->top);
}
//打印栈
void StackPrint(Stack *pStack)
{
int i = pStack->top;
while (i != 0)
{
printf("%d ", pStack->array[i-1]);
i--;
}
printf("\n");
}
.c文件:
#include"stack.h"
void test()
{
Stack pStack1;
StackInit(&pStack1);
StackInit(&pStack2);
StackPush(&pStack1,1);
StackPush(&pStack1,3);
StackPush(&pStack1,5);
StackPush(&pStack1,7);
StackPrint(&pStack1);
StackPop(&pStack1);
StackPop(&pStack1);
StackPrint(&pStack1);
int p = StackTop(&pStack1);
printf("栈顶元素为:%d\n", p);
int p1 = StackIsEmpty(&pStack1);
printf("%d\n", p1);
int p2 = StackSize(&pStack1);
printf("栈内有%d个元素\n", p2);
}
int main()
{
test();
system("pause");
return 0;
}
关于栈的一些内容,若有不对,还请指正。