- 栈的顺序存储结构
# define MAXSIZE <最大元素数>
typedef struct
{
datatype elem[MAXSIZE];
int top;
}SeqStack;
1.入栈
int Push_SeqStack(SeqStack *S,datatype x) //插入数据元素x
{
if(S->top==MAXSIZE-1)
printf("栈满不能入栈");
return 0;
else
{
S->top++;//栈顶指针加一
S->elem[S->top]=x;//将插入的数据元素x赋给栈顶空间
return 1;
}
}
- 2.出栈
int Pop_SeqStack(SeqStack*S,datatype*x)
{
if(S->top=-1)
printf("栈空不能出栈");
rreturn 0;
else
{
*x=S->elem[S->top];//栈顶元素存入*下,返回
S->top--;//栈顶指针减一
return 1;
}
}
//入栈先判栈满,条件为S->top==MAXSIZE-1,栈满是不能入栈,否则空间溢出,这就叫上溢;
//出栈和读栈顶先判栈空,为空时不能操作,否则产生错误,这就叫下溢。
- 两个栈的共享空间
/*question 两个栈的共享空间
*@thought if两个栈共享一个一维数组stack[MAXSIZE],so 利用栈的“栈底位置不变,栈顶位置动态变化”的特点,两个栈底在两头也就是-1和MAXSIZE,栈顶往中间延伸。只要整个数组stack[MAXSIZE]未满,两个栈都不会上溢
*/
#define MAXSIZE <最大元素>
typedef struct
{
datatype stack [MAXSIZE];//data域
int lefttop;//左栈栈顶位置指示器
int righttop;//右栈栈顶位置指示器
}dupsqstack;
//左栈栈顶往右边移动加一,右栈栈顶往左移减去一
//为了识别左右栈,设标识记忆
char status;
status='L'//左栈
status='R'//右栈
//栈满条件为S->lefttop-S->righttop=1
- 1.初始化操作
int initDupStack(dupsqstack *S)
{
if((S=(dupsqstack*)malloc(sizeof(dupsqstack)==NULL)//创建空间
return 0;
S->lefttop=-1;
S->righttop=MAXSIZE;
return 1;
}
- 2.入栈操作——先判断栈满
int pushDupStack(dupsqstack*S,char status,datatype x)
{
if ((S->lefttop+1==S->righttop)
piintf("栈满");
return 0;
if(status='L')
S->stack[++S->lefttop]=x;//左栈进栈
else
if(status='R')
S->stack[--S->righttop]=x; //右栈进栈
else
return 0;//参数错误
return 1;
}
- 3.出栈操作
datatype popDupStack(dupsqstack*S,char status)
{
if(S->lefttop<0)
printf("左栈为空");
return NULL;
else
return (S->stack[S->lefttop--];//左栈出栈
}
else
if(status=='R')
{
if(S->righttop>MAXSIZE-1)
retuen NULL;
else
return(S->stack[S->righttop++]);//右栈出栈
}
else
return NULL;//参数错误
}
链栈:链式存储结构实现的栈。
typedef struct node
{
datatype data ;
struct node *next;
}StackNode ,*LinkStackptr;//ptr表示指针,LinkStackptr top为栈顶元素
//用一个计数器记录链栈中元素的个数:int count。将top、count放在一个结构体中
typedef struct linkStack//定义一个这样的结构体
{
LinkStackptr top;
int count;
}linkStack;
因为链栈区别于单链表,主要是栈的操作是在栈顶进行插入和删除,单链表中为了实现这个特意设了头节点,而显然将链表的头部作栈顶就行,不用单独设头节点
空栈,头指针为空,S->top=NULL
**入栈**
//假设x是要入栈的元素,首先建立一个结点p,将其数据域赋值给下,即p->data=x;将p的后继指针指向栈的S->top,即S->top=p->next,之后将S->top指针指向p,记得给栈中元素加一
int Push_LinkStack(LinkStack *S,datatype x)
{
LinkStackptr p;
if(((p=LinkStackptr)malloc (sizeof(StackNode)))==NULL)
return 0;
p->data=x;
p->next=S->top;//将当前栈顶的指针元素赋给插入节点的后继
S->top=p;
S->count++;
return 1;
}
//## 出栈,栈不空用一个指针p指向当前栈顶,栈顶指针下移一位,释放p,最后栈中元素减去一
LinkStack Pop_LinkStack(LinkStack*S,datatype*x)
{
LinkStackptr p;
if(S->top==NULL)
return NULL;//栈空判断
else
{
*x=(S->top)->data;
p=S->top;//栈顶结点赋给p
S->top=(S->top)->next;//栈顶指针下移一位
free(p);
S->count--;
return(S->top);
}
}
``