顺序栈的进栈操作

来源:互联网 发布:福特嘉年华st轮毂数据 编辑:程序博客网 时间:2024/06/05 10:51

转至:http://www.nowamagic.net/librarys/veda/detail/2272

对于栈来说,最重要的操作之一就是进栈。

如上图所示,进栈操作push大概分为两步。

  1. 栈顶指针 S->top 先自增1,给需要进栈的元素腾出内存空间。
  2. 再赋值。就是给对应的数组元素赋值:S->data[S->top]=e
/* 插入元素e为新的栈顶元素 */Status Push(SqStack *S,SElemType e){    if(S->top == MAXSIZE -1) /* 栈满 */    {        return ERROR;    }    S->top++;/* 栈顶指针增加一 */    S->data[S->top]=e;  /* 将新插入元素赋值给栈顶空间 */    return OK;}

插入元素之前,要进行栈的初始化也就是构造一个空栈,所以只要将指针 top 指向 -1就行。S->top=-1

/*  构造一个空栈S */Status InitStack(SqStack *S){    /* S.data=(SElemType *)malloc(MAXSIZE*sizeof(SElemType)); */    S->top=-1;    return OK;}

初始化完了,把栈的遍历操作也补一下:
/* 从栈底到栈顶依次对栈中每个元素显示 */Status StackTraverse(SqStack S){    int i;    i=0;    while(i<=S.top)    {        visit(S.data[i++]);    }    printf("\n");    return OK;}Status visit(SElemType c){    printf("%d ",c);    return OK;}

完整的可执行程序代码:
#include "stdio.h"#include "stdlib.h"#define OK 1#define ERROR 0/* 存储空间初始分配量 */#define MAXSIZE 20typedef int Status;/* SElemType类型根据实际情况而定,这里假设为int */typedef int SElemType;/* 顺序栈结构 */typedef struct{    SElemType data[MAXSIZE];    int top; /* 用于栈顶指针 */}SqStack;/*  构造一个空栈S */Status InitStack(SqStack *S){    /* S.data=(SElemType *)malloc(MAXSIZE*sizeof(SElemType)); */    S->top=-1;    return OK;}/* 从栈底到栈顶依次对栈中每个元素显示 */Status StackTraverse(SqStack S){    int i;    i=0;    while(i<=S.top)    {        visit(S.data[i++]);    }    printf("\n");    return OK;}Status visit(SElemType c){    printf("%d ",c);    return OK;}/* 插入元素e为新的栈顶元素 */Status Push(SqStack *S,SElemType e){    if(S->top == MAXSIZE -1) /* 栈满 */    {        return ERROR;    }    S->top++;/* 栈顶指针增加一 */    S->data[S->top]=e;  /* 将新插入元素赋值给栈顶空间 */    return OK;}int main(){    SqStack s;    int opp;    int j;    if(InitStack(&s)==OK)    {        printf("顺序栈初始化成功。");        StackTraverse(s);    }    printf("\n1.随机给栈赋值 \n2.栈遍历");    printf("\n0.退出 \n请选择你的操作:\n");    while(opp != '0'){        scanf("%d",&opp);        switch(opp){            case 1:                srand(time(0));                for(j=1;j<=10;j++)                {                    Push(&s,rand()%100+1);                }                StackTraverse(s);                break;            case 2:                StackTraverse(s);                break;            case 0:                exit(0);        }    }}


0 0
原创粉丝点击