顺序堆栈的存储结构类型描述如下:
#define M 1000 /* 定义堆栈的最大容量 */ SElemType STACK[ M ]; int top; /* 栈顶指针变量 */
下面是基本算法描述,很简单:
#include<stdlib.h> #include<stdio.h> #define M 1000 /* 定义堆栈的最大容量 */ /* 初始化一个堆栈 */ void initials( int *top ){ *top = -1; } /* 测试堆栈是否为空, 当堆栈为空时,算法返回1,否则返回0 */ int isEmpty( int top ){ return top == -1; } /* 测试堆栈是否已满, 当堆栈已满时,算法返回1,否则返回0 */ int isFull( int top ){ return top == M -1; } /* 取当前栈顶元素,将当前栈顶元素取出送变量item,需测试堆栈是否为空 */ int getTop( int *st, int top, int *item ){ if( isEmpty( top ) ) /* 堆栈为空,操作失败,返回0 */ return 0; else{ *item = st[ top ]; /* 保存栈顶元素 */ return 1; /* 堆栈非空,操作成功,返回1 */ } } /* 进栈,需测试堆栈是否已满 */ int push( int *st, int *top, int item ){ if( isFull( *top ) ) /* 堆栈已满,插入失败,返回0 */ return 0; else{ st[ ++( *top ) ] = item; return 1; /* 插入成功,返回1 */ } } /* 退栈,需测试堆栈是否为空 */ int pop( int *st, int *top, int *item ){ if( isEmpty( *top ) ) return 0; /* 堆栈为空,删除失败,返回0 */ else{ *item = st[ ( *top )-- ]; return 1; /* 删除成功,返回1 */ } }
下面是测试上述算法是否正确的代码:
/* 打印堆栈 */ void printStack( int *st, int top ){ while( top != -1 ){ printf( "%d\n", st[ top ] ); top--; } } int main(){ int stack[ M ]; int top; initials( &top ); push( stack, &top, 5 ); push( stack, &top, 8 ); push( stack, &top, 9 ); push( stack, &top, 2 ); printStack( stack, top ); printf( "the stack is full %d\n", isFull( top ) ); int item; pop( stack, &top, &item ); printf( "the pop elem is %d\n", item ); getTop( stack, top, &item ); printf( "the top elem is %d\n", item ); pop( stack, &top, &item ); pop( stack, &top, &item ); pop( stack, &top, &item ); printf( "the stack is empty: %d\n", isEmpty( top ) ); return 0; }