#include <iostream>
using namespace std;
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
typedef char SElemType;
typedef struct {
/************************************************************************/
/*定义栈的结构体 */
/*Went 2011-10-26 20:15 */
/************************************************************************/
SElemType *base; //在栈构造之前和销毁之后,base为NULL
SElemType *top; //栈顶指针
int stacksize; //当前已分配的存储空间,以元素为单位
}SqStack;
int InitStack(SqStack &S) {
//initial a stack
S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S.base)
return OVERFLOW;
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
int StackEmpty(SqStack &S) {
//whether the stack is empty
if (S.base == NULL)
return ERROR;
if (S.base == S.top)
return TRUE;
return FALSE;
}
int DestroyStack(SqStack &S) {
//destroy the stack
if (S.base == NULL)
return ERROR;
if (StackEmpty(S)) {
free(S.base);
free(S.top);
printf("destroy the empty stack successfully!\n");
}
free(S.base);
S.base = S.top = NULL;
S.stacksize = 0;
return OK;
}
int ClearStack(SqStack &S) {
//clear the stack
if (S.base == S.top)
return ERROR;
S.base = S.top;
S.stacksize = 0;
return OK;
}
int StackLength(SqStack S) {
//get the length of the stack
if (S.base == NULL)
return ERROR;
return S.top - S.base;
}
int GetTop(SqStack S, SElemType &e) {
//get the top element if it exists
if (S.base == S.top)
return ERROR;
e = *(S.top - 1);
return OK;
}
int Push(SqStack &S, SElemType e) {
//push an element into the stack as a new top element
if (S.top - S.base >= S.stacksize) {
//increase the room of stack
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;
return OK;
}
int Pop(SqStack &S, SElemType &e) {
//delete the top element
if (S.top == S.base)
return ERROR;
e = *--S.top;
return OK;
}
int visit(SElemType e) {
cout << e << " ";
return OK;
}
int StackTraverse(SqStack S, int (*visit)(SElemType)) {
//visit all the elements of the stack
SqStack q;
q = S;
if (S.top == S.base)
return ERROR;
while(q.top != q.base) {
visit(*--q.top);
}
cout << endl;
return OK;
}
int main() {
SqStack s1;
SElemType e;
InitStack(s1);
Push(s1, 'a');
Push(s1, 'b');
GetTop(s1, e);
StackTraverse(s1, visit);
cout << e << endl;
cout << StackLength(s1) << endl;
DestroyStack(s1);
cout << "end of the process!\n";
system("pause");
return 0;
}
SqStack
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.