线性表之栈的顺序存储实现

来源:互联网 发布:药智网数据库 编辑:程序博客网 时间:2024/06/06 03:14
栈是一种受限制的线性表,说其受限制是因为它的插入和删除只能在栈顶操作
栈的特性是后进先出,所以也将栈称为后进先出(LIFO)表。
        栈的顺序存储也称为线性栈,是利用一组地址连续的存储单元依次存放自栈底到栈顶的元素。用栈顶指针top来标识栈顶元素在顺序栈中的位置。

栈的结构体表示:
typedef struct 
{
    int data[MAXNUM];       //存储数据的数组
    int top;                //指向栈顶元素,在数组中相当下标
}seqstack;

插入元素操作:
需先将top指针指向栈顶上面的空位,然后再进行赋值。
void Push(seqstack *stack,int val)
{
    if(stack->top >= MAXNUM-1)
    {
        printf("栈已满!\n");
        return ;
    }
    stack->top++;       //top指针先指向栈顶上面的空位
    stack->data[stack->top] = val;//将数据元素入栈,成为新的栈顶元素
}

删除元素操作:
将top指针向下移动,指向新的栈顶元素
int Pop(seqstack *stack)
{
    if(!IsEmpty(stack))
        return stack->data[stack->top--];   //弹出栈顶元素,并且栈顶指针向下一位
    return 0;

}


顺序栈的C语言实现:(codeblocks完美运行)

#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXNUM 100typedef struct{    int data[MAXNUM];       //存储数据的数组    int top ;                //指向栈顶元素,在数组中相当下标}seqstack;//初始化顺序栈void Initstack(seqstack *stack){    memset(stack->data,0,MAXNUM);    stack->top = -1;}//判断栈是否为空,是返回1,否则返回0int IsEmpty(seqstack *stack){    if(stack->top == -1)        return 1;    else    {        return 0;    }}//返回栈顶指针指向的元素int Top(seqstack *stack){    if(!IsEmpty(stack))        return stack->data[stack->top];    return 0;}//出栈int Pop(seqstack *stack){    if(!IsEmpty(stack))        return stack->data[stack->top--];   //弹出栈顶元素,并且栈顶指针向下一位    return 0;}//入栈void Push(seqstack *stack,int val){    if(stack->top >= MAXNUM-1)    {        printf("栈已满!\n");        return ;    }    stack->top++;       //top指针先指向栈顶上面的空位    stack->data[stack->top] = val;//将数据元素入栈,成为新的栈顶元素}void destroy_stack(seqstack *stack){    if(!IsEmpty(stack))        free(stack);    else    {        printf("栈已为空!\n");        return ;    }}int main(){    int i;    srand((unsigned)time(0));    seqstack stack;                       //创建一个顺序栈    Initstack(&stack);    for(i=0;i<30;i++)        Push(&stack,rand()%100);            //创建30个0-99的随记数,并入栈    printf("栈顶元素为:%d\n",Top(&stack));    printf("打印栈顶元素:\n");    for(i=0;i<30;i++)    {        if(i%6 == 0)            printf("\n");        printf("%3d  ",Pop(&stack));    }    printf("\n销毁栈!\n");    destroy_stack(&stack);    return 0;}

运行界面: