數據結構——順序棧(動態分配空間)的基本操作


代碼主要來源:【數據結構】【清華大學】【嚴蔚敏】
順序棧S的基本運算如下:
(1)初始化棧S
(2)棧為空
(3)依次進棧元素a,b,c,d,e
(4)棧為非空
(5)出棧序列:e d c b a
(6)棧為空
(7)釋放棧

完整代碼如下:

#include <stdio.h>
#include <stdlib.h> 
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1 
#define OVERFLOW -1
#define ERROR 0

typedef int SElemType;
typedef int Status;

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


Status InitStack(SqStack &S)
{
	S.base=((SElemType*)malloc(sizeof(SqStack)*STACK_INIT_SIZE));
	if(!S.base) exit(-1);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
} 

Status Push(SqStack &S, SElemType e)//插入棧頂元素操作 
{
    if(S.top-S.base>=S.stacksize) //判斷棧滿,若滿則追加存儲空間
    {
        S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!S.base)
            exit(OVERFLOW); 
        S.top=S.base+S.stacksize;// S.top指向新的S.base+S.stacksize(也有可能S.base沒變) 
        S.stacksize+=STACKINCREMENT;
    }
    *S.top++=e;  //先賦值然后位置再加一 
    return OK;
}

Status Pop(SqStack &S,SElemType &e)
{
    if(S.top==S.base)//棧頂和棧頂指向同一個存儲空間則棧滿了 
        return ERROR;
    e=*--S.top;  //指針位置先減一再賦值 
    return OK;
}


Status GetTop(SqStack S,SElemType &e)//返回棧頂元素,不刪除 
{
    if(S.top>S.base)
    {
        e=*(S.top-1);
        return OK;
    }
    else
        return ERROR;
}

Status StackEmpty(SqStack S)
{
    if(S.top==S.base)
        return 1;
    else
        return 0;
}

Status DestroyStack(SqStack &S)
{
    free(S.base);
    S.base=S.top=NULL; 
    S.stacksize=0;
    return OK;
}


int main()
{
	char a[5]={'a','b','c','d','e'};
	SqStack s1;
	int i,e1;
	InitStack(s1);
	if(InitStack(s1))
	{
		printf("初始化成功!\n"); 
	}
	if(StackEmpty(s1))
	{
		printf("此時棧為空\n"); 
	}
	printf("依次進棧元素:a,b,c,d,e\n"); 
	for(i=0;i<5;i++)
	{
		Push(s1,a[i]);
	}
	if(!StackEmpty(s1))
	{
		printf("此時棧非空\n"); 
	}
	printf("出棧序列為:"); 
	while(!StackEmpty(s1))
	{
		Pop(s1,e1);
		printf("%c ",e1);
	 } 
	if(StackEmpty(s1))
	{
		printf("\n此時棧為空\n"); 
	}
	if(DestroyStack(s1))
	{
		printf("釋放棧成功!\n"); 
	}
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM