栈这种数据结构是在线性表和链表上进行改造得到的。
下面程序分别实现了栈的顺序存储结构和栈的链式存储结构的压栈和弹栈操作,均在DEV C++下运行通过。
/*栈的顺序存储结构*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h>
#include<windows.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 10
typedef int SElemType;
typedef int Status;
typedef struct
{
SElemType data[MAXSIZE];
int top;
}SqStack;
Status Push(SqStack *S,SElemType e)
{
if(S->top==MAXSIZE-1)
return ERROR;
S->top++;
S->data[S->top]=e;
return OK;
}
Status Pop(SqStack *S,SElemType *e)
{
if(S->top==-1)
return ERROR;
*e=S->data[S->top];
S->top--;
return OK;
}
int main()
{
SqStack sqstack;
sqstack.top=-1;//栈为空时top=-1!!!
SElemType e=44,ee=0;
Push(&sqstack,e);
printf("%d\n",sqstack.data[0]);
Pop(&sqstack,&ee);
printf("%d\n",ee);
}
/*栈的链式存储结构*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h>
#include<windows.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 10
typedef int SElemType;
typedef int Status;
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
} StackNode,*LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
int count;
}LinkStack;
Status Push(LinkStack *S,SElemType e)
{
LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
s->data=e;
s->next=S->top;
S->top=s;
S->count++;
return OK;
}
Status Pop(LinkStack *S,SElemType *e)
{
LinkStackPtr p;
*e=S->top->data;
p=S->top;
S->top=S->top->next;
free(p);
S->count--;
return OK;
}
int main()
{
LinkStack linkstack;
linkstack.count=0;
linkstack.top=NULL;
SElemType e=123,ee;
Push(&linkstack,e);
printf("%d\n",linkstack.top->data);
Pop(&linkstack,&ee);
printf("%d\n",ee);
}