1、顺序栈的结构C语言描述
#define TRUE 1
#define FALSE 0
#define Stack_Size 50
typedef struct{
StackElementType elem[Stack_Size];
int top;
}SeqStack
顺序栈的基本操作
(1)初始化操作
void lnitStack(SeqStack *s)
{
s->top=-1;
}
(2)判栈空操作
int isEmpty(SeqStack *S)
{
return(s->top==-1?TRUE:FALSE);
}
(3)判栈满操作
int isFull(SeqStack *S)
{
return(s->top==Stack_Size-1?TRUE:FALSE);
}
(4)进栈操作
int push(SeqStack *s,StackElementType x)
{
if(s->top==Stack_Size-1)
return(FALSE); //判栈满
s->top++;
s->elem[s->top]=x;
return(TRUE);
}
(5)出栈操作
int pop(SeqStack *S,StackElementType *x)
{
if(s->top==-1)
return(FALSE); //判栈空
else
{
*x=s->elem[s->topn]; //栈顶要出栈的元素给x
s->top--;
return(TRUE);
}
}
(6)读栈顶元素操作
读栈顶元素操作与出栈操作大致相同,它们的区别仅在于读栈顶元素操作时候栈顶指针不动,栈内保持不变。
int getTop(SeqStack s,StackElementType *x)
{
if(s->top==-1)
return(FALSE);
else
{
*x=s->elem[s->top];
return[TRUE];
}
}
2、两栈共享技术
利用了栈的栈底位置不变,而栈顶位置动态变化的特性,为两个栈申请一个共享的一维数组空间s[M],将两个栈的栈底分别为一维数组的两端0和M-1。
两栈共享的基本操作
(1)结构定义
#define M100
typedef struct
{
StackElementType Stack[M];
int top[2];
}DqStack;
(2)两栈共享的初始化操作
void initStack(DqStack *S)
{
s->top[0]=-1;
s->top[1]=M;
}
(3)两栈共享的进栈操作
int push(DqStack *s,StackElementType x,int i)
{
if(s->top[0]+1==s->top[1])
return(FALSE);
switch(i)
{
case 0:s->top[0]++;
s->Stack[s->top[0]]=x;
break;
case 1:s->top[1]--;
s->Stack[s->top[1]]=x;
break;
default:return(FALSE);
}
return(TRUE);
}
(4)两栈共享的出栈操作
int pop(DqStack *s,StackElementType *x,int i)
{
switch(i)
{
case 0:if(s->top==-1) return(FALSE);
*x=s->Stack[s->top[0]];
s->top[0]--;
break;
case 1:if(s->top[1]==M) return(FALSE);
*x=s->Stack[s->top[1]];
s->top[1]++;
break;
default:return(FALSE);
}
return(TRUE);
}
3、栈的链式存储结构
(1)用C语言定义的链式存储结构
typedef struct Node
{
StackElementType data;
struct node *next;
}LinkStackNode;
typedef LinkStackNode *LinkStack;
(2)链栈的进栈操作
int push(LinkStack top,StackElementType x)
{
LinkStackNode *temp;
temp=(LinkStackNode *)malloc(sizeof(LinkStackNode));
if(temp==Null) return(FALSE);
temp->data=x;
temp->next=top->next;
top-next=temp;
return(TRUE);
}
(3)链栈的出栈操作
int pop(LinkStack top,StackElementType *x)
{
LinkStackNode *temp;
temp=top->next;
if(temp==Null) return(FALSE);
top->next=temp->next;
*x=temp->data;
free(temp);
return(TRUE);
}