一、顺序存储
程序代码
# include <stdio.h>
// 顺序栈的定义
#define MaxSize 10
typedef struct{
int data[MaxSize]; // 静态数组存放栈中元素
int top; // 栈顶指针 指向数组下标,从0开始
}SqStack;
// 1、初始化
bool InitStack(SqStack &S){
S.top = -1; // 初始化栈顶指针
return true;
}
// 2、判断栈空
bool IsEmpty(SqStack S){
if(S.top == -1){ // 栈空
return true;
}else{
return false;
}
}
// 3、入栈
bool PushELem(SqStack &S,int e){
if(S.top == MaxSize - 1){ // 栈满,不能插入新元素
return false;
}
S.top = S.top + 1; // 先将栈顶指针 +1
S.data[S.top] = e; // 新元素入栈
// 两行合并
// S.data[++S.top] = e 指针先加 1 ,再入栈
return true;
}
// 4、出栈
bool PopElem(SqStack &S,int &e){ // 元素出栈,并将出栈元素返回
if(S.top == -1){ // 栈空
return false;
}
e = S.data[S.top]; // 栈顶元素出栈
S.top = S.top - 1;
// e = S.data[S.top--]; 先出栈,指针 -1
return true;
}
// 5、读取栈顶元素
bool Top(SqStack S,int &e){
if(S.top == -1){ // 栈空
return false;
}
e = S.data[S.top];
return true;
}
// 元素遍历
int list(SqStack S){
int i = 0;
for(i = 0;i<=S.top;i++){
printf("%d ",S.data[i]);
}
}
int main()
{
SqStack S;
InitStack(S);
PushELem(S,23);
PushELem(S,25);
PushELem(S,26);
PushELem(S,27);
printf("入栈顺序:");
list(S);
printf("\n");
int e = -1;
PopElem(S,e);
printf("出栈的元素是:%d\n",e);
printf("栈中剩余元素:");
list(S);
return 0;
}
测试
入栈顺序:23 25 26 27
出栈的元素是:27
栈中剩余元素:23 25 26
--------------------------------
Process exited after 0.01482 seconds with return value 0
请按任意键继续. . .
二、链式存储
程序代码:
# include <stdio.h>
# include <stdlib.h>
// 不带头结点的链栈
typedef struct StackNode{
int data; // 数据域
struct StackNode *next; // 指针域
}StackNode ,*LinkStock;
// 1、链栈初始化
bool InitLinkStock(LinkStock &S){
S = NULL;
return true;
}
// 2、链栈是否为空
bool isEmpty(LinkStock S){
if(S == NULL){
return true;
}
else{
return false;
}
}
// 3、链栈入栈操作
bool LinkStackPush(LinkStock &S,int e){
StackNode *p;
p = (StackNode *) malloc(sizeof(StackNode));
p->data = e;
p->next = S;
S = p;
return true;
}
// 4、出栈
bool LinkStackPop(LinkStock &S,int &e){
StackNode *p;
if(S == NULL){ // 栈空,无法删除
return false;
}
e = S->data;
p = S;
S = S->next;
free(p);
return true;
}
// 5、读取栈顶元素
bool TopELem(LinkStock S,int &e){
if(S == NULL){ // 栈空
return false;
}
e = S->data;
return true;
}
// 6、元素遍历
int list(LinkStock S){
StackNode *p;
p = S;
while(p!= NULL){
printf("%d ",p->data);
p = p->next;
}
}
int main()
{
LinkStock S;
InitLinkStock(S);
LinkStackPush(S,55);
LinkStackPush(S,56);
LinkStackPush(S,89);
LinkStackPush(S,855);
printf("入栈顺序:");
list(S);
printf("\n");
int e = -1;
LinkStackPop(S,e);
printf("出栈的元素是:%d\n",e);
printf("栈中剩余元素:");
list(S);
return 0;
}
测试
入栈顺序:855 89 56 55
出栈的元素是:855
栈中剩余元素:89 56 55
--------------------------------
Process exited after 0.01333 seconds with return value 0
请按任意键继续. . .
链式存储采用的是头插法:
所以元素入栈的顺序是:855>89>56>55
栈顶元素是 55