使用数组来实现。其中下标为0的一端作为栈底,将数组尾部作为栈顶,以进行插入和删除
使用一个变量top进行栈顶标识,top之外元素将不属于栈的定义范围
初始化使top=-1时, 空栈的判断条件为:top==-1 【常用】
初始化使top=0时, 空栈的判断条件为:top==0,相应的增删也会有所不同
具体不同看下面实现代码
sequence–>顺序的意思–>sq
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶元素
}SqStack;
void testStack(){
SqStack S; //声明一个顺序栈(分配空间)
}
// 初始化栈
void InitStack(SqStack &S){
S.top = -1; //初始化栈顶指针
}
只有入栈的时候,才会考虑是否满了
先+1后赋值
bool Push(SqStack &S, ElemType x){
if(S.top == MaxSize - 1) // 判断栈是否已满
return false;
S.data[++S.top] = x;
return true;
}
只有出栈的时候,才会考虑是否为空
先赋值后-1
bool Pop(SqStack &x, ElemType &x){
if(S.top == -1) // 判断栈是否为空
return false;
x = S.data[S.top--];
return true;
}
和pop( )唯一的不同是:没有-1
bool GetTop(SqStack S, ElemType &x){
if(S.top == -1)
return false;
x = S.data[S.top];
return true;
}
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct{
ElemType data[MaxSize]; //静态数组存放栈中元素
int top0; //0号栈栈顶指针
int top1; //1号栈栈顶指针
}ShStack;
// 初始化栈
void InitStack(ShStack &S){
S.top0 = -1; //在外边
S.top1 = MaxSize; //在外边
}
//判断是否满
top0 + 1 == top1
typedef struct StackNode{
ElemType data; //数据域
Linknode *next; //指针域
}StackNode,*StackLinkList;
void testStack(){
StackLinkList L; //声明一个链栈
}
bool InitStack(StackLinkList &L){
L = (StackNode *)malloc(sizeof(StackNode));
if(L == NULL)
return false;
L->next = NULL;
return true;
}
bool isEmpty(StackLinkList &L){
if(L->next == NULL)
return true;
else
return false;
}
bool pushStack(StackLinkList &L,ElemType x){
StackNode *s = (StackNode *)malloc(sizeof(StackNode));
if(s == NULL)
return false;
s->data = x;
// 头插法
s->next = L->next;
L->next = s;
return true;
}
bool popStack(StackLinkList &L, int &x){
// 栈空不能出栈
if(L->next == NULL)
return false;
StackNode *s = L->next;
x = s->data;
L->next = s->next;
free(s);
return true;
}