顺序栈&&共享栈&&链式栈

mac2025-12-19  6

顺序栈

#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define MAXSIZE 50 //定义栈中元素的最大个数 typedef struct{ int data[MAXSIZE]; // 存放栈中元素 int top; //栈顶指针 }SqStack; //初始化栈 void Init_SqStack(SqStack &S){ S.top = -1; return; } //1. Top值不能超过MaxSize //2. 空栈的判定条件通常定为top == -1,满栈的判定条件通常为top == MaxSize - 1,栈中数据元素个数为top + 1 //判空 bool StackEmpyt(SqStack S){ if (S.top == -1) return true; else return false; } //进栈 void push(SqStack &S, int x){ //&s引用,对原对象操作,s与原对象属性相同的对象 if (S.top == MAXSIZE - 1){ printf("Fulled"); return; } S.data[++S.top] = x; } //出栈 void Pop(SqStack &S, int &x){ // 把出栈的值赋给x,所以引用x if (S.top == -1){ printf("Empty"); return; } x = S.data[S.top--]; } //读取栈顶元素 bool GetTop(SqStack S, int &x){ // 把出栈的值赋给x,所以引用x if (S.top == -1){ printf("Empty"); return false; } x = S.data[S.top]; return true; }

共享栈

#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define MAXSIZE 50 //定义栈中元素的最大个数 typedef struct{ int data[MAXSIZE]; // 存放栈中元素 int top1; // 栈1栈顶指针 int top2; // 栈2栈顶指针 }SqDoubleStack; //栈满的条件:指针top1和top2只相差1,即top1 + 1 == top2 //压栈 void Push(SqDoubleStack &S, int x, int stackNum){ if (S.top1 + 1 == S.top2){ printf("Fulled"); // 栈满了 return; } if (stackNum == 1) S.data[++S.top1] = x; else if (stackNum == 2) S.data[--S.top2] = x; return; }

链式栈

入栈

出栈

#include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef struct SNode{ int data; // 存放栈中元素 struct SNode *next; // 下一个结点 }SNode, *SLink; // 结点 typedef struct LinkStack{ SLink top; // 栈顶指针 int count; // 链栈结点数 }LinkStack; // 链栈 //进栈 void Push(LinkStack *S, int x){ SLink p = (SLink)malloc(sizeof(SNode)); //给新元素分配空间 //SNode *p = (SNode*)malloc(sizeof(SNode)); //这是等价的 p->data = x; // 新元素的值 p->next = S->top; // p的后继指向栈顶元素 S->top = p; //栈顶指针指向新的元素 S->count++; //栈中元素个数加1 } //出栈 void Pop(LinkStack *S, int &x){ if (S->top == NULL){ printf("Empty"); return; } x = S->top->data; // 栈顶元素值 SLink p = S->top; // 辅助指针 S->top = S->top->next; //栈顶指针后移 free(p); //释放被删除数据的存储空间 S->count--; //栈中元素个数减一 }

代码有些地方用&,有的用SqStack *S,SqStack S,甚至有的用SqStack *& S。

这里可以看作SqStack S操作的是局部变量,不会影响原来的值,其他的都会改变原来的值

最新回复(0)