顺序:
#include<iostream>
#include<cstdio>
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -2
#define ERROR 0
typedef struct{
int *base;
int *top;
int stacksize;
}Sqstack;
void InitStack(Sqstack &S){
S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}
void Push(Sqstack &S,int e){
if(S.top-S.base>=S.stacksize){//栈满,追加空间
S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
if(!S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.STACK_INIT_SIZE+=STACKINCREMENT;
}
*S.top++=e;
}
int GetLength(Sqstack S){
int len=0;
int *p=S.top;//这里不能再用S.top了,不然就把栈给清空了
while(p!=S.base){
len++;
p--;
}
printf("长度为%d\n",len);
return len;
}
void Traverse(Sqstack S){
int n=GetLength(S);
printf("从栈底到栈顶元素依次是:\n");
for(int i=0;i<n;i++){
printf("%d ",S.base[i]);
}
printf("\n");
}
void Pop(Sqstack &S,int &e){
if(S.top==S.base)exit(0);
e=*--S.top;
}
int main(){
Sqstack L;
InitStack(L);
int n=5;
while(n--){
Push(L,n);
}
Traverse(L);
Pop(L,n);
printf("弹出元素为%d\n",n);
Traverse(L);
}
链式:
#include<iostream>
#include<cstdio>
#include<malloc.h>
#define OVERFLOW -2
typedef struct node{
int data;
struct node *next;
}LStack,*LinkStack;
void InitStack(LinkStack &S){
S=(LinkStack)malloc(sizeof(LStack));
if(!S)exit(OVERFLOW);
S->next=NULL;
}
int GetLength(LinkStack &S){
int i=0;
LStack *p=S->next;
while(p){
p=p->next;
i++;
}
printf("结点数为:%d\n",i);
return i;
}
void Push(LinkStack &S,int e){
LStack *p;
p=(LinkStack)malloc(sizeof(LStack));
if(!p)exit(OVERFLOW);
p->data=e;
p->next=S->next;
S->next=p;
}
void Pop(LinkStack &S){
if(!S->next)return;
LStack *p;
p=S->next;
printf("弹出的值为:%d\n",p->data);
S->next=p->next;
free(p);
}
void Traverse(LinkStack &S){
LStack *p;
p=S->next;
printf("栈顶->栈底依次是:\n");
while(p){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main(){
LinkStack T;
InitStack(T);
int n=5;
while(n--){
Push(T,n);
}
GetLength(T);
Traverse(T);
Pop(T);
Traverse(T);
}