栈顺序存储结构

栈是限定仅在表尾来进行插入和删除操作的线性表,能够插入和删除的一端称为栈顶,它是一个特殊的线性表,但也有前驱后继关系

由于限定了插入和删除的位置,始终只在栈顶来进行,因此栈底是固定的,最新进栈的元素肯定在栈底,因此用数组下标为0的一端作为栈底比较好,因为首元素都在栈底,变化最小

定义一个变量top来表示栈顶元素在数组中的位置,由于栈顶是可以随意操作的,因此top就像可以来回移动一样,变大或者变小,但肯定不能超过存储栈的长度,而且由于top相当于下标,数组是从0开始的,因此当栈里只有一个元素时,top为0;而空栈判定条件top为-1

顺序栈结构

typedef int StackElemType;

typedef struct {

    StackElemType data[MAXSIZE];

    int top;

}SqStack;

进栈和出栈,还算不错,随手写的,结果无误,虽然弱,菜鸟表示有进步

#include <stdio.h>
#include <malloc.h>

typedef int StackElemType;
#define MAXSIZE 10

typedef struct {
    StackElemType data[MAXSIZE];
    int top;
}SqStack;

int stackpop(SqStack *stack){
    if (stack->top == -1)
        return 0;
    –stack->top;
    return 0;
}

int stackpush(SqStack *stack, int num){
    if (stack->top == MAXSIZE – 1)
        return 0;
    ++stack->top;
    stack->data[stack->top] = num;
    return 0;
}

int main(){
    SqStack *S;
    S = (SqStack *)malloc(sizeof(SqStack));
    S->top = -1;
    int i;
    for (i = 0; i < MAXSIZE; i++){
        S->data[++S->top] = i;
    }
    stackpop(S);
    stackpop(S);
    stackpush(S, 100);
    int j;
    for (j = 0; j <= S->top; j++){
        printf(“No %d is: %d\n”, j, S->data[j]);
    }
    free(S);
    S = NULL;
    return 0;
}

发表回复