线性表————栈

定义顺序栈类型
#define StackSize 100  //假定预分配栈空间最多为100个元素
typedef char DataType;   //假定栈元素的数据类型为字符
typedef struct{
       DataType data[StackSize];
	   int top;
}SeqStack;
顺序栈的基本操作

(1)进栈
进栈时 需要将S->top加1
S->top==StackSize-1表示栈满
“上溢”现象 当栈满时,再做进栈运算产生空间溢出的现象
(2)退栈
退栈时,需要将S->top减1
S->top<0表示空栈
"下溢"现象   当栈空时,退栈运算产生的溢出现象

顺序栈的基本运算
(1)置栈为空
void InitStack(SeqStack *S)
{    //将顺序栈置空
      S->top=-1;
}
(2)判断栈为空
int StackEmpty(SeqStack *S)
{
    return S->top==-1;
}
(3)判断栈满
int StackFull(SeqStack *SS)
{
   return S->top==StackSize-1;
}
(4)进栈
void Push(S,x)
{
    if(StackFull(S))
	      Error("Stack overflow");  //上溢,退出运行
    S->data[++S->top]=x;          //栈顶指针加1后将x入栈
}
(5)退栈
DataType Pop(S)
{
       if(StackEmpty(S))
	       Error("Stack underflow");   //下溢,退出运行
		return S->data[S->top--];       //栈顶元素返回后将栈顶指针减1
}
(6)获取栈顶元素
DataType StackTop(S)
{
    if(StackEmpty(S))
	     Error("Stack is empty");
    return S->data[S->top];
}
链栈

定义链栈类型
typedef struct stacknode
{
    DataType data;
	struct stacknode *next;
}StackNode;
typedef struct
{
    StackNode *top;//栈顶指针
}LinkStack;
(1)置栈为空
void InitStack(LinkStack *S)
{
     S->top=NULL;
}
(2)判断栈为空
int StackEmpty(LinkStack *S)
{
     return S->top==NULL;
}
(3)进栈
void Push(LinkStack *S,DataType x)
{
    //将元素x插入链栈头部
    StackNode *p=(StackNode *)malloc(sizeof(StackNode));
    p->data=x;
    p->next=S->top;  //将新结点*p插入链栈头部
    S->top=p;	
}
(4)退栈
DataType Pop(LinkStack *S)
{
   DataType x;
   StackNode *p=S->top;  //保存栈顶指针
   if(StackEmpty(S))
       Error("Stack underflow."); //下溢
	x=p->data;
	S->top=p-next;//将栈顶结点从链上摘下
	free(p);
	return x;
}
(5)获取栈顶元素
DataType StackTop(LinkStack *S)
{
    if(StackEmpty(S))
	   Error("Stack is empty.");
	return S->top->data;
}
栈的各种操作实现
SeqStack.h
//(1)定义头文件
typedef struct stack
{
     DATA data[SIZE+1];  //数据元素
	 int top; //栈顶
}SeqStack;
//(2)初始化栈
SeqStack *SeqStackInit()
{
    SeqStack *p;
	if(p=(SeqStack *)malloc(sizeof(SeqStack)))  //申请栈内存
	{
	     p->top=0;                             //设置栈顶为0
		 return p;                             //返回指向栈的指针
	}
	return NULL;
}
void SeqStackFree(SeqStack *s)  //释放栈所占用空间
{
     if(s)
	    free(s);
}
//(3)判断栈状态
int StackIsEmpty(SeqStack *s)   //判断栈是否为空
{
     return(s->top==0);
}
void SeqStackClear(SeqStack *s)   //清空栈
{
    S->top=0;
}
int SeqStackIsFull(SeqStack *s)   //判断栈是否已满
{
    return(s->top==SIZE);
}
//(4)入栈和出栈操作
int SeqStackPush(SeqStack *s,DATA data)   //入栈操作
{
    if((s->top+1)>SIZE)
	{
	    printf("栈溢出!\n");
		return 0;
	}
	s->data[++s->top]=data;  //将元素入栈
	return 1;
}
DATA SeqStackPop(SeqStack *s)  //出栈操作
{
    if(s->top==0)
	{
	     printf("栈为空!");
		 exit(0);
	}
	return (s->data[s->top--]);
}
//(5)获取栈顶元素
DATA SeqStackPeek(SeqStack *s)
{
    if(s->top==0)
	{
	     printf("栈为空!");
		 exit(0);
	}
	return (s->data[s->top]);
}




#include
#include
#define SIZE 50
typedef struct
{
    char name[15];
	int age;
}DATA;
#include "SeqStack.h"
void main()
{
   SeqStack *stack;
   DATA data,data1;
   stack=SeqStackInit();
   printf("入栈操作:\n");
   printf("输入姓名 年龄进行入栈操作:");
   scanf("%s%d",data.name,&data.age);
   SeqStackPush(stack,data);
   printf("输入姓名 年龄进行入栈操作:");
   scanf("%s%d",data.name,&data.age);
   SeqStackPush(stack,data);
   printf("\n出栈操作:\n按任意键碱性出栈操作:");
   getchar();
   data1=SeqStackPop(stack);
   printf("出栈的数据是(%s,%d)\n",data1.name,data1.age);
   printf("再按任意键进行出栈操作:");
   getchar();
   
   data1=SeqStackPop(stack);
   printf("出栈的数据是(%s,%d)\n",data1.name,data1.age);
   SeqStackFree(stack);
   getchar();
   
}


你可能感兴趣的:(线性表————栈)