// 栈 是限定在表尾进行插入和删除操作的线性表
// 队列是值允许在一端插入,一端删除操作的线性表
#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;
}