栈
1.1定义
栈:只允许在表尾进行删除和插入的操作的线性表
1.2栈的存储结构
1.2.1栈的顺序存储结构
- 栈的结构定义
- 出栈和入栈
- 两栈共用空间**
//栈的顺序存储结构
//栈的结构定义
struct stack
{
int data[MAXSIZE];
int top;
}sqstack;
//入栈(顺序存储结构)
/*插入元素e为新的栈顶元素*/
int push(sqstack *s,int e)
{
if(s->top==MAXSIZE-1)
return -1;//错误
s->top++;
s->data[s->top]=e;
return 0;
}
//出栈
int Pop(sqstack *s, int *e)//因为不return e;所以这里用指针改变变量的值
{
if(s->top==-1)
return -1;//错误
*e=s->data[s->top];
s->top--;
}
1.2.2 栈的链式存储结构
//栈的链式存储
typedef struct StackNode
{
int data;
struct nodestack *next;
}StackNode,*LinkStackptr;
typedef struct LinkStack
{
LinkStackptr top;
int count;
}LinkStack;
int push(LinkStack *S,int e)
{
s=(LinkStackptr)malloc(sizeof(LinkStackptr));
s->data=e;
s->next=S->top;
S->top=s;
s->count++;
return 0;
}
//删除S的栈顶元素,
int Pop(LinkStack *S,int e)
{
LinkStackptr p;
*e=S->top->data;
p=S->top;
S->top=S->top->next;
free(p);
s->count--;
}
栈的简单应用
1.栈的链式存储结构
#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
struct stacknode
{
int data;
struct stacknode *next;
};
struct linkstack
{
struct stacknode *top;
int count;
};
void push(struct linkstack *s,int e)
{
struct stacknode *m=(struct stacknode*)malloc(sizeof(struct stacknode));//为什么不是定义结构体 而是定义结构体指针
m->data=e;
m->next=s->top;
s->top=m;
s->count++;
}
void pop(struct linkstack *s,int *e)
{
struct stacknode *p;
*e=s->top->data;
p=s->top;
s->top=s->top->next;
free(p);
s->count--;
}
int main()
{
struct linkstack s;
int x;
int i;
printf("请输入入栈元素:");
for(i=0;i<3;i++)
{
scanf("%d",&x);
push(&s,x);
}
printf("出栈元素为:");
for(i=0;i<3;i++)
{
pop(&s,&x);
printf("%d ",x);
}
}
2,栈的顺序存储 结构
#include<stdio.h>
#define maxsize 10
struct stack
{
int data[maxsize];
int top;
};
int push(struct stack *s,int e)
{
if(maxsize-1==s->top)
{
return -1;
}
s->top++;
s->data[s->top]=e;
return 1;
}
int pop(struct stack *s,int *e)
{
if(s->top==-1)
return -1;
*e=s->data[s->top];
s->top--;
}
int main()
{
struct stack s;
int x;
int i;
printf("请输入入栈元素:");
for(i=0;i<3;i++)
{
scanf("%d",&x);
push(&s,x);
}
printf("出栈元素为:");
for(i=0;i<3;i++)
{
pop(&s,&x);
printf("%d ",x);
}
}
共用栈
//两栈共享空间
typedef stack
{
int data[MAXSIZE];
int top1;
int top2;
}sqstack;
//两栈共享空间的结构插入元素
int push(sqstack *s,int e,int stackname) //stackname表示栈一或栈二
{
if(s->top1+1==s->top2)
return -1;
if(stackname==1)
s-data[++s->top1]=e;
else
s-data[--s->top2]=e;
return 0;
}//两栈共享空间结构之弹出元素
int Pop(sqstack *s,int *e,int stackname)//
{
if(stackname==1)
{
if(s->top==-1)
return -1;//error
*e=s->data[s->top1++];
}
else if(stackname==2)
{
if(s->top2==MAXSIZE)
return -1;
*e=s->data[s->top2--];
}
return 0;
}
#include<stdio.h>
#define maxsize 3
#define error -1
#define ok 1
struct sqdoublestack
{
int data[maxsize];
int top1;
int top2;
}Sqdoublestack;
void initstack(struct sqdoublestack *s)
{
s->top1=-1;
s->top2=maxsize;
}
int push(struct sqdoublestack *s,int stacknumber,int e)
{
if(s->top1+1==s->top2)
return error;
if(stacknumber==1)
{
s->top1++;//0 1 2
s->data[s->top1]=e;
}
else if(stacknumber==2)
{
s->top2--;
s->data[s->top2]=e;
}
return ok;
}
int pop(struct sqdoublestack *s,int stacknumber,int *e)
{
if(stacknumber==1)
{
if(s->top1==-1)
return error;//栈一为空栈
*e=s->data[s->top1];
s->top1--;
}
else if(stacknumber==2)
{
if(s->top1==maxsize)
return error;//栈2空栈
*e=s->data[s->top2];
s->top2++;
}
return ok;
}
int main()
{
int x;
struct sqdoublestack s;
initstack(&s);
printf("请输入三位入栈的元素:");
for(int i=0;i<3;i++)
{
scanf("%d",&x);
push(&s,2,x);
}
printf("出栈元素:");
for(int i=0;i<3;i++)
{
pop(&s,2,&x);
printf("%d ", x);
}
}