#include <stdio.h> #define MAXSIZE 20 #define SIZE sizeof(SEQSTACK) #define LINE_ITEM_COUNT (5) //每行的元素个数
#define PRINT_BOOL "%d " //对bool类型数据的输出的宏定义
#define SCANF_ITEM "%d" //对输入项进行宏定义
#define PRINT_ITEM "%d "
typedef short bool; //定义bool类型
const bool true = 1; //定义bool类型中的真
const bool false = 0; //定义bool类型中的假
typedef int ELEMTYPE; //定义栈中元素的类型
const ELEMTYPE STACK_NULL = -9999; //自定义栈为NULL的值为 -9999
//我们定义栈中的data[0]不存储任何信息,作为栈底的标志
//因此我们知道在我们定义的栈中存在的数据为从1到MAXSIZE-1。即MAXSIZE - 1 个元素。
typedef struct //定义顺序栈
{ ELEMTYPE data[MAXSIZE]; int top; }SEQSTACK;
SEQSTACK * INITSTACK(); //初始化空栈
bool EMPTY(SEQSTACK *);//判断栈是否是空栈
bool PUSH (SEQSTACK *,ELEMTYPE);//将元素进行压栈,true压栈成功,false压栈失败
ELEMTYPE POP(SEQSTACK *);//将元素进行出栈,如果栈为空,则返回STACK_NULL
int LENGTH(SEQSTACK *); //获取栈的长度
ELEMTYPE GETTOP(SEQSTACK *);//获取栈顶元素,如果栈为空,则返回STACK_NULL
void CLEAR(SEQSTACK *);//将栈进行清空
void menu(); //菜单
void print_tab(); //打印tab键
void print_enter(); //打印回车键
void print_menu_item(char *,char *); //输出菜单项
void print_str(char *); //输出字符
void print_info(char *); //输出相关信息
void print_select_menu(); //输出选择菜单
SEQSTACK * init_stack(); //初始化栈
void is_empty(SEQSTACK *);//判断是否是空栈
bool is_init_stack(SEQSTACK *);//判断栈是否初始化
void stack_push(SEQSTACK *); //进栈操作
void stack_pop(SEQSTACK *);//出栈操作
void stack_gettop(SEQSTACK *); //获取栈顶元素
void stack_clear(SEQSTACK *);//将栈置空
void stack_method(SEQSTACK *,void (* fun)(SEQSTACK *)); //使用指向函数指针对系统进行重构
int main(int argc, char *argv[]) { SEQSTACK *stack = NULL; int select_item_value; menu(); do { print_select_menu(); scanf("%d",&select_item_value); switch(select_item_value) { case -1: break; case 0: menu(); break; case 1: stack = init_stack(); break; case 2: stack_method(stack,is_empty); break; case 3: stack_method(stack,stack_push); break; case 4: stack_method(stack,stack_pop); break; case 5: stack_method(stack,stack_gettop); break; case 6: stack_method(stack,stack_clear); break; default: menu(); break; } }while(select_item_value != -1); return 0; }
SEQSTACK * INITSTACK() { SEQSTACK * stack = (SEQSTACK *)malloc(SIZE); stack->top = 0; return stack; }
bool EMPTY(SEQSTACK * stack) { bool result; if (stack->top > 0) { result = true; } else { result = false; } return result; }
bool PUSH (SEQSTACK * stack,ELEMTYPE data) { bool result; if ( stack == NULL || stack->top >= MAXSIZE - 1) { result = false; } else { stack->top ++; stack->data[stack->top] = data; result = true; } return result; }
ELEMTYPE POP(SEQSTACK * stack) { ELEMTYPE result; if (LENGTH(stack) > 0) { result = stack->data[stack->top]; stack->top --; } else { result = STACK_NULL; } return result; }
int LENGTH(SEQSTACK * stack) { return stack->top; }
ELEMTYPE GETTOP(SEQSTACK * stack) { ELEMTYPE result; if (LENGTH(stack) > 0) { result = stack->data[stack->top]; } else { result = STACK_NULL; } return result; }
void CLEAR(SEQSTACK * seq) { seq->top = 0; }
void menu() { print_enter(); print_info("sequence stack manage system"); print_enter(); print_menu_item("1","init seq stack"); print_menu_item("2","judge seq stack is empty"); print_menu_item("3","push element"); print_menu_item("4","pop element"); print_menu_item("5","get top element"); print_menu_item("6","empty stack"); print_menu_item("0","return menu"); print_menu_item("-1","exit system"); }
void print_tab() { printf("\t"); }
void print_enter() { printf("\n"); }
void print_menu_item(char * num,char * desc) { print_tab(); print_str(num); print_tab(); print_str(desc); print_enter(); }
void print_str(char * str) { while(*str) { printf("%c",*str++); } }
void print_info(char * str) { print_tab(); print_str(str); print_enter(); }
void print_select_menu() { print_tab(); print_str("select menu:"); }
SEQSTACK * init_stack() { print_info("init stack success."); return INITSTACK(); }
void is_empty(SEQSTACK * stack) { bool result = EMPTY(stack); if (result) { print_info("sequence stack is ok."); } else { print_info("sequence is empty."); } }
bool is_init_stack(SEQSTACK * stack) { if(NULL == stack) { print_info("sequence stack not init."); return false; } return true; }
ELEMTYPE input_method() { print_tab(); print_str("plsease input data:"); ELEMTYPE input; scanf(SCANF_ITEM,&input); return input; }
void stack_push(SEQSTACK * stack) { ELEMTYPE element = input_method(); bool result = PUSH(stack,element); if (result) { print_info("push data success."); } else { print_info("push data fall."); } }
void stack_pop(SEQSTACK * stack) { ELEMTYPE element = POP(stack); if (element == STACK_NULL) { print_info("the stack is null"); } else { print_tab(); printf("the pop element is "); printf(PRINT_ITEM,element); print_enter(); } }
void stack_gettop(SEQSTACK * stack) { ELEMTYPE element = GETTOP(stack); if (element == STACK_NULL) { print_info("the stack is null"); } else { print_tab(); printf("the top element is "); printf(PRINT_ITEM,element); print_enter(); } }
void stack_clear(SEQSTACK * stack) { CLEAR(stack); print_info("stack is empty now."); }
void stack_method(SEQSTACK * stack,void (* fun)(SEQSTACK * src_stack)) { if (!is_init_stack(stack)) { return; } else { (* fun)(stack); } }
|