//palist->t来表示当前的数据下标,即可以模拟先进后出的特性
//栈数据结构体(最大值,指示当前栈中数的个数t,所存数据类型的指针s)
struct SeqStack{
int MAXNUM;
int t;
DataType * s;
};
//基本操作压栈
void push_seq(PSeqList pastack, DataType x){
/* code */
if(pastack->t >= MAXNUM - 1 ) //提示是否上溢
printf("overflow\n");
else{
pastack->t = pastack->t+1; //栈中数量加一
pastack->s[pastack->t] = x;//数据进栈
}
}
void pop_seq(PSeqList pastack/* arguments */) {
/* code */
if(pastack-> t== -1) //检查是否下溢
printf("Underflow!\n");
else
//出栈就是删除栈顶元素
pastack->t = pastack->t-1;//
}
//取栈顶元素
DataType top_seq(PSeqList pastack)
{
if( pastack->t == -1 )
printf("It is empty!\n");//判断是否为空
else
return (pastack->s[pastack->t]);//返回当前栈顶元素
}
//____________以下为链栈实现算法___________________//
//链栈的数据结构体(info为栈中数据元素,Link统一指向下一个info)
struct Node;
typedef struct Node* PNode;
struct Node{
DataType info;
PNode Link;
}
struct LinkList{ //此结构体指针一律指向当前栈顶
PNode top;
}
typedef struct LinkList *PLinkStack;
PLinkStack createEmptyStack_link(void) //创建空的链栈
{
PLinkStack plstack;
plstack = (PLinkStack)malloc(sizeof(struct LinkList)); //申请空间
if( plstack != NULL) //判断是否申请成功
plstack->top = NULL; //先指向空
else
printf("Out of space!\n");
return plstack;
}
int isEmptyStack_link(PLinkStack plstack) //判断链栈是否为空
{
return (plstack->top == NULL);
}
void push_link(PLinkStack plstack,DataType x) //压栈(与普通的略有不同)
{
PNode p;
p = (PNode)malloc(sizeof(struct Node));
if(p == NULL)
{
printf("out of space!\n");
}
else
{
p->info = x; //现存入参数
p->link = pastack->top; //现在p的link指针指向栈顶,实际上就是把p->link指向原节点的数据域
plstack->top = p;//栈顶指向新存入节点数据域
}
}
void pop_link(PLinkStack plstack)//弹栈
{
PNode p;
if(isEmptyStack_link(plstack))
printf("Empty stack pop.\n");
else
{
p = plstack->top; // 为了把第一个节点释放,因此p在这里是标记
plstack->top = plstack->top->link;//栈顶指向栈中第二个元素
free(p);//释放原来的节点
}
}
DataType top_link(PLinkStack plstack) // 返回栈顶元素
{
if(pastack->top == NULL)
printf("Stack is empty!\n");
else
return (plstack->top->info);//直接return栈顶的数据域元素
}