算法与数据结构之栈的操作----顺序栈

//顺序栈
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

#define ERROR 0
#define OVERFLOW -2
#define OK 1
#define STACK_INIT_SIZE 100;
#define STACKINCREMENT 10;

typedef int SElemType;


typedef struct{
	SElemType *base;
	SElemType *top;
	int stacksize;
}SqStack;



int InitStack(SqStack &S)                                 //为栈S分配存储空间,并构造一个空栈S
{  
	int size=STACK_INIT_SIZE;
	S.base = (SElemType * )malloc(size * sizeof(SElemType));
	if(!S.base) exit (OVERFLOW);                      //存储分配失败
	S.top = S.base;                                  //置栈S为空栈
	S.stacksize = STACK_INIT_SIZE;
	return OK;
}//InitStack

int  GetTop(SqStack S,SElemType &e)  //若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
{
    if(S.top == S.base) return ERROR;
	e = *(S.top-1);
	return OK;
}//GetTop

int  Push(SqStack &S, SElemType e)    //进栈函数,将e插入栈S中,并使之成为栈顶元素,插入元素e为新的栈顶元素
{   
	if(S.top - S.base >= S.stacksize) {         //栈满,追加存储空间
	int stackincrement=STACKINCREMENT
	S.base = (SElemType *) realloc(S.base,(S.stacksize+stackincrement) * sizeof(SElemType));
	if(!S.base) return (OVERFLOW);      //存储分配失败
	S.top = S.base + S.stacksize;
	S.stacksize += STACKINCREMENT; 
}

*S.top++=e;      //先赋e,在++,即*S.top=e; S.top++;
return OK;
}//Push

int Pop(SqStack &S,SElemType &e){ //出栈函数,若栈S不空,则删除S的栈顶元素,用e返回其值,并返回OK,否则返回ERROR
	if(S.top == S.base) return ERROR;
    e=*--S.top;         //先减1,再取值,即S.top--; e=*S.top;
    return OK; 
}//Pop

void OutputStack(SqStack &S)              //输出栈的元素

{
	int *q;
	q = S.top-1;
	for(int i=0;i<S.top-S.base;i++)
	{
		printf("%3d ",*q);
		q--;
	}
	
}//OutputStack

void main()

{      
	
	   int a,b,c ;
	   char m;
	   
       SqStack s;
	   
       InitStack(s);
	   printf("请输入要进栈的元素个数是:");
	   
       scanf("%d",&a);
	   
       printf("\n请输入要进栈的%d个元素:",a);
	   
	   for(b=0;b<a;b++) 
	   {       
		   scanf("%d",&c);
		   Push(s,c); 
	   }

	   do {
	   printf("\n");
	   printf("*********** 1.输出栈的元素**********\n");
	   printf("*********** 2.取栈顶元素************\n");
	   printf("*********** 3.删除栈顶元素**********\n");
	   printf("*********** 4.退出程序**********\n");
	   printf("\n请选择一个字符:");
	   getchar();
	   scanf("%c",&m);
	   switch(m) 
	   {
	   case '1': printf("\n输出的栈为:");
		         OutputStack(s);break;
		   
	   case '2': GetTop(s,c);  
		         printf("\n栈顶元素为:%d",c);
		         printf("\n输出的栈为:");
		         OutputStack(s);break;
	   case '3': Pop(s,c);
		         printf("\n删除的栈顶元素:%d",c);
		         printf("\n输出的栈为:");
		         OutputStack(s);
		         printf("\n");break;
	   case '4':break;
	   default: printf("输入的数字有错,请重新选择!\n"); break;
		   
	   } 
	   
	   }
	   while(m!='4');
	   
}

你可能感兴趣的:(算法与数据结构之栈的操作----顺序栈)