栈是限定仅在表尾来进行插入和删除操作的线性表,能够插入和删除的一端称为栈顶,它是一个特殊的线性表,但也有前驱后继关系
由于限定了插入和删除的位置,始终只在栈顶来进行,因此栈底是固定的,最新进栈的元素肯定在栈底,因此用数组下标为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;
}