数据结构-栈
// 栈 是限定在表尾进行插入和删除操作的线性表 // 队列是值允许在一端插入,一端删除操作的线性表 #include<stdio.h> #define MAXSIZE 1000 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status; typedef int SElemType; typedef struct SqStack{ SElemType data[MAXSIZE]; int top; }SqStack; //插入元素e为新的栈顶元素 Status Push(SqStack *S,SElemType e){ if(S->top == MAXSIZE-1){//栈满 return ERROR; } S->top++; S->data[S->top]=e; return OK; } //出栈操作 删除S的栈顶元素,用e返回值 Status Pop(SqStack *S,SElemType *e){ if(S->top==-1){ return ERROR; } *e=S->data[S->top]; S->top--; return OK; }
//两栈共享空间 #include<stdio.h> #define MAXSIZE 1000 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status; typedef int SElemType; typedef struct SqDoubleStack{ SELemType data[MAXSIZE]; int top1; int top2; }SqDoubleStack; //插入元素值 stackNumber 判断是栈1还是栈2 Status Push(SqDoubleStack *S,SElemType e,stackNumber){ if(S->top1+1=S->top2){ return ERROR;//栈满 } if(stackNumber==1){ S->data[++S->top1] =e; } else if(stackNumber==2){ S->data[--S->top2]=e; } return OK; } // 若栈不空,删除S栈顶元素,用e返回其值 Status Pop(SqDoubleStack *S,SELemType *e,int stackNumber){ if(stackNumber==1){ if(S->top1==-1){ return ERROR; } *e=S->data[S->top1--]; }else if(stackNumber==2){ if(S->top2==MAXSIZE){ return ERROR; } *e=S->data[S->top2++]; } return OK; }
//栈的链式存储 #include<stdio.h> #define MAXSIZE 1000 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status; typedef int SElemType; typedef struct StackNode{//为结点 SELemType data; struct StackNode *next; }StackNode,*LinkStackPtr; typedef struct LinkStack{//设置链栈 LinkStackPtr top; int count; }LinkStack; //插入元素e为新的栈顶元素 Status Push (LinkStack *S,SElemType e){ LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode)); s->data=e; s->next=S->top;//把当前栈顶元素赋值给新节点的直接后继 S->top=s; S->count++; return OK; } //删除栈顶元素,用e返回其值 Status Pop(LinkStack *S,SElemType e){ LinkStackPtr p; if(StackEmpty(*S)) { return ERROR; } *e=S->top->data; p=S->top; S->top=S->top->next; free(p); S->count--; return OK; }