1.top指向栈顶元素,令S.top = -1。
(1)初始化
//初始化
void InitStack(SqStack *S)
{
S->top = -1;
}
(2)判断栈是否为空
//判断栈是否为空
bool StackEmpty(SqStack *S)
{
if(S->top == -1)
return true;
else
return false;
}
(3)进栈
//进栈
bool Push(SqStack *S,int x)
{
if(S->top == Maxsize-1)//栈满,报错
return false;
S->data[++S->top] = x;//指针先加1,再入栈
return true;
}
(4)出栈
//出栈
bool Pop(SqStack *S,int &x)
{
if(S->top == -1)//栈空,报错
return false;
x = S->data[S->top--];//先出栈,指针再减1
return true;
}
(5)读栈顶元素
//读栈顶元素
int GetTop(SqStack *S,int &x)
{
if(S->top == -1)
return 0;
else
{
x = S->data[S->top];
return x;
}
}
(6)遍历输出
//遍历输出
bool Traverse(SqStack *S)
{
int i = S->top;
if(StackEmpty(S))
{
printf("栈为空!");
return false;
}
else
{
while(i != -1)
{
printf("%d\n",S->data[i--]);
}
return true;
}
}
运行结果
2.栈顶指针初始化为S.top=0,即top指向栈中下一个可以插入元素的位置
(1)初始化
//初始化
void InitStack(SqStack *S)
{
S->top = 0;//初始化
}
(2)判断栈是否为空
//判断栈是否为空
bool StackEmpty(SqStack *S)
{
if(S->top == 0)//当为0时栈为空
return true;
else
return false;
}
(3)进栈
//进栈
bool Push(SqStack *S,int x)
{
if(S->top == Maxsize+1)//栈满,报错
return false;
S->data[S->top++] = x;//先入栈,指针再加1,所以压栈10个元素之后指针为11
return true;
}
(4)出栈
//出栈
bool Pop(SqStack *S,int &x)
{
if(S->top == 0)//栈空,报错
return false;
x = S->data[--S->top];//指针先减1,再出栈,所以当栈中元素全部出栈之后指针为0
return true;
}
(5)读栈顶元素
//读栈顶元素
int GetTop(SqStack *S,int &x)
{
if(S->top == 0)
return 0;
else
{
x = S->data[S->top];
return x;
}
}
运行结果
前两个对比,++S->top表示的是先加1然后再运行S->data[] ;S->top++表示的是先运行S->data[]然后S->top再加1.
3.共享栈
利用栈底元素相对位置不变的特性,可以让顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。两个栈的栈顶指针都是指向栈顶元素,假设top0=-1时为top0那边栈为空,top1=maxsize为top1那边栈为空;仅当两个指针相邻(top1-top0=1)时,判断栈满。top0先加1再赋值,top1先减1再赋值;相当于top0指向小的那边,top1指向栈大的那边
(1)初始化
void InitStack(SqStack &S)
{
S.top0 = -1;
S.top1 = maxsize;
}
(2)判断栈是否为空
bool StackEmpty(SqStack &S)
{
if(S.top0 == -1 || S.top1 == maxsize)
return true;
else
return false;
}
(3)进栈
bool Push(SqStack &S, int x,int y)
{
if(S.top1 - S.top0 == 1)
return false;
else
{
S.data[++S.top0] = x;
S.data[--S.top1] = y;
}
return true;
}
(4)出栈
bool Pop(SqStack &S,int &x,int &y)
{
if(S.top0 != -1 || S.top1 != maxsize )
return false;
else
{
x = S.data[S.top0--];
y = S.data[++S.top1];
}
return true;
}
(5)读栈顶元素
因为C++里面不可以同时返回两个值,所以可以通过结构体来达成,并且不要弄成指针类型,例如val->a这样是无法输出出去,会出错
return_X_Y Get(SqStack &S,int &x,int &y)
{
struct return_X_Y val;
if(S.top0 != -1)
val.a = S.data[S.top0];
if(S.top1 != maxsize)
val.b= S.data[S.top1];
return val;
}
(6)遍历输出
void traverse(SqStack &S)
{
if(S.top0 == -1 || S.top1 == maxsize)
{
printf("栈为空!\n");
return;
}
if(S.top0 == -1)
printf("top0那边为空\n");
if(S.top1 == maxsize)
printf("top1那边为空\n");
int i = S.top0;
int j = S.top1;
printf("top0那边元素为:\n");
while(i != -1)
{
printf("%d\n",S.data[i--]);
}
printf("top1那边元素为:\n");
while(j != maxsize)
{
printf("%d\n",S.data[j++]);
}
return;
}
运行结果
结构体中“.”与“->”的区别
1、A->a表示A是指向结构体的指针
2、A.a表示A是结构体
3、A->a等效于(*A).a
4、A.B则A为对象或者结构体
5、A->B则A为指针,->是成员提取,A->B是提取A中的成员B,A只能是指向类、结构、联合的指针;
可以通过顺序栈和共享栈进行比较“.”与“->”的用法
顺序栈中使用的是"->"如果将其换成”.“,然后将S前的”*“换成"&",然后将main函数中的&去掉也会运行成功,以此来体验结构体中”.“与”->“的差别
全部代码
顺序表
//本次代码数据域以整数型为主
#include<stdio.h>
#define Maxsize 10
typedef struct
{
int data[Maxsize];
int top;
}SqStack;
//函数说明
void InitStack(SqStack *S);//初始化
bool StackEmpty(SqStack *S);//判断栈是否为空
bool Push(SqStack *S,int x);//进栈
bool Pop(SqStack *S,int &x);//出栈
int GetTop(SqStack *S,int &x);//读取栈顶元素
bool Traverse(SqStack *S);//遍历输出
int main(void)
{
SqStack S;
int x;
InitStack(&S);
Push(&S,1);
Push(&S,2);
Push(&S,3);
Push(&S,4);
Push(&S,5);
Push(&S,6);
Push(&S,7);
Push(&S,8);
Push(&S,9);
Push(&S,10);
Traverse(&S);
int val = GetTop(&S,x);
printf("栈顶元素为:%d\n",val);
Pop(&S,x);
printf("出栈之后栈中元素为:\n");
Traverse(&S);
return 0;
}
/*//top指的是栈顶元素
//初始化
void InitStack(SqStack *S)
{
S->top = -1;
}
//判断栈是否为空
bool StackEmpty(SqStack *S)
{
if(S->top == -1)
return true;
else
return false;
}
//进栈
bool Push(SqStack *S,int x)
{
if(S->top == Maxsize-1)//栈满,报错
return false;
S->data[++S->top] = x;//指针先加1,再入栈
return true;
}
//出栈
bool Pop(SqStack *S,int &x)
{
if(S->top == -1)//栈空,报错
return false;
x = S->data[S->top--];//先出栈,指针再减1
return true;
}
//读栈顶元素
int GetTop(SqStack *S,int &x)
{
if(S->top == -1)
return 0;
else
{
x = S->data[S->top];
return x;
}
}
//遍历输出
bool Traverse(SqStack *S)
{
int i = S->top;
if(StackEmpty(S))
{
printf("栈为空!");
return false;
}
else
{
while(i != -1)
{
printf("%d\n",S->data[i--]);
}
return true;
}
}
*/
//top指向栈顶元素的下一个位置
//初始化
void InitStack(SqStack *S)
{
S->top = 0;//初始化
}
//判断栈是否为空
bool StackEmpty(SqStack *S)
{
if(S->top == 0)//当为0时栈为空
return true;
else
return false;
}
//进栈
bool Push(SqStack *S,int x)
{
if(S->top == Maxsize+1)//栈满,报错
return false;
S->data[S->top++] = x;//先入栈,指针再加1,所以压栈10个元素之后指针为11
return true;
}
//出栈
bool Pop(SqStack *S,int &x)
{
if(S->top == 0)//栈空,报错
return false;
x = S->data[--S->top];//指针先减1,再出栈,所以当栈中元素全部出栈之后指针为0
return true;
}
//读栈顶元素
int GetTop(SqStack *S,int &x)
{
if(S->top == 0)
return 0;
else
{
x = S->data[S->top];
return x;
}
}
//遍历输出
bool Traverse(SqStack *S)
{
int i = S->top;
if(StackEmpty(S))
{
printf("栈为空!");
return false;
}
else
{
while(i != 0)
{
printf("%d\n",S->data[--i]);
}
return true;
}
}
共享栈
#include<stdio.h>
#define maxsize 15
typedef struct
{
int data[maxsize];
int top0;
int top1;
}SqStack;
struct return_X_Y
{
int a;
int b;
};
//函数说明
void InitStack(SqStack &S);
bool StackEmpty(SqStack &S);
bool Push(SqStack &S, int x,int y);
bool Pop(SqStack &S,int &x,int &y);
return_X_Y Get(SqStack &S,int &x,int &y);
void traverse(SqStack &S);
int main(void)
{
SqStack S;
int x,y;
InitStack(S);
Push(S,1,-1);
Push(S,2,-2);
Push(S,3,-3);
Push(S,4,-4);
Push(S,5,-5);
Push(S,6,-6);
Push(S,7,-7);
traverse(S);
struct return_X_Y pVal = Get(S,x,y);
printf("top0,top1两边栈顶元素分别为:%d,%d\n",pVal.a,pVal.b);
Pop(S,x,y);
printf("删除元素之后栈中元素为:\n");
traverse(S);
return 0;
}
void InitStack(SqStack &S)
{
S.top0 = -1;
S.top1 = maxsize;
}
bool StackEmpty(SqStack &S)
{
if(S.top0 == -1 || S.top1 == maxsize)
return true;
else
return false;
}
bool Push(SqStack &S, int x,int y)
{
if(S.top1 - S.top0 == 1)
return false;
else
{
S.data[++S.top0] = x;
S.data[--S.top1] = y;
}
return true;
}
bool Pop(SqStack &S,int &x,int &y)
{
if(S.top0 != -1 || S.top1 != maxsize )
return false;
else
{
x = S.data[S.top0--];
y = S.data[++S.top1];
}
return true;
}
return_X_Y Get(SqStack &S,int &x,int &y)
{
struct return_X_Y val;
if(S.top0 != -1)
val.a = S.data[S.top0];
if(S.top1 != maxsize)
val.b= S.data[S.top1];
return val;
}
void traverse(SqStack &S)
{
if(S.top0 == -1 || S.top1 == maxsize)
{
printf("栈为空!\n");
return;
}
if(S.top0 == -1)
printf("top0那边为空\n");
if(S.top1 == maxsize)
printf("top1那边为空\n");
int i = S.top0;
int j = S.top1;
printf("top0那边元素为:\n");
while(i != -1)
{
printf("%d\n",S.data[i--]);
}
printf("top1那边元素为:\n");
while(j != maxsize)
{
printf("%d\n",S.data[j++]);
}
return;
}