數據結構的C實現_順序棧

//編譯環境 visual studio 2008,win32 console application.
//SqStack.c

//順序棧
#include <stdio.h>
#include <stdlib.h>
#define    OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACKINITSIZE 100//初始化空間分配量
#define STACKINCREASEMENT 10//分配增量
typedef char elemType;//元素類型

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

//初始化棧
int InitStack(SqStack *s)
{
s->base=(elemType *)malloc(STACKINITSIZE*sizeof(elemType));
if(!s->base) exit(OVERFLOW);
s->top=s->base;
s->stacksize=STACKINITSIZE;
return OK;
}

//獲取棧的長度(元素個數)
int StackLength(SqStack *s)
{
int length=0;
elemType *p=s->base;
while(p!=s->top)//自下朝上增加
{
p++;
length++;
}
return length;
}
//獲取棧的長度(元素個數),另一種方法
void GetLength(SqStack *s)
{
printf("棧的元素個數爲%d\n",s->top-s->base);
}

//遍歷棧,自頂向下
int StackTraverse(SqStack *s)
{
elemType *p=s->top;
printf("該棧自頂向下的元素爲:\n");
while(p!=s->base)
{
p--;
printf("%c",*p);
}
printf("\n");
return OK;
}

//獲取棧頂元素
int GetTop(SqStack *s)
{
if(s->top==s->base)
printf("棧爲空\n");
return ERROR;
printf("%c",*(s->top-1));
return OK;
}

//插入值爲e的棧頂元素
int Push(SqStack *s,elemType e)
{
if(s->top-s->base==s->stacksize)//棧滿,插入棧頂元素需要重新分配空間
{
s->base=(elemType *)realloc(s->base,(s->stacksize+STACKINCREASEMENT)*sizeof(elemType));
if(!s->base) exit(OVERFLOW);
s->top=s->base+STACKINCREASEMENT;
}
//*(s->top++)=e;
*(s->top)=e;
s->top++;//top指向棧頂元素的上方,先賦值,再top++
return OK;
}

//刪除棧頂元素
int Pop(SqStack *s)
{
if(s->base==s->top)
{
printf("棧爲空\n");
return ERROR;
}
//printf("已刪除棧頂元素 %c\n",*(--s->top));
s->top--;
printf("已刪除棧頂元素 %c\n",*(s->top));//top指向棧頂元素的上方,先top--,再輸出值
return OK;
}
//判斷棧是否爲空
void StackEmpty(SqStack *s)
{
if(s->top==s->base)
printf("該棧爲空\n");
else
printf("該棧不爲空\n");
}
//清空棧
int ClearStack(SqStack *s)
{
if(s->base==s->top)
printf("棧已經爲空\n");
else
{s->base=s->top;
printf("棧已經被清空\n");
}
return OK;
}

main()
{
SqStack *s=(SqStack*)malloc(sizeof(SqStack));
InitStack(s);
StackEmpty(s);
printf("插入棧頂元素...\n");
Push(s,'a');
Push(s,'b');
Push(s,'c');
Push(s,'d');
StackEmpty(s);
StackTraverse(s);
printf("棧的元素個數爲%d\n",StackLength(s));
//GetLength(s);
Pop(s);
StackTraverse(s);
//printf("棧的元素個數爲%d\n",StackLength(s));
GetLength(s);
ClearStack(s);
StackEmpty(s);
printf("棧的元素個數爲%d\n",StackLength(s));
//GetLength(s);
} 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章