抽象數據類型棧的定義
棧的表示和實現
出棧進棧過程
程序實現
/*****************************************************
Description:
順序棧的實現
*****************************************************/
#include <stdio.h>
#include <stdlib.h>
#define Max 10
struct stack_data
{
int stack[Max];
int top;
};
typedef struct stack_data Stack;
enum return_value{FULL_OK,FULL_ON,PUSH_ERROR,PUSH_OK,POP_NO = 20,EMPTY,EMPTY_NO};
void creat_stack(Stack ** stack)
{
*stack = (Stack *)malloc(sizeof(Stack));
if(*stack == NULL)
{
printf("creat stack failed !\n");
exit(-1);
}
}
void init_stack(Stack ** stack)
{
(*stack) -> top = -1;
}
int is_full(Stack ** stack)
{
if((*stack)->top == Max)
{
return FULL_OK;
}
return FULL_ON;
}
int is_empty(Stack ** stack)
{
if((*stack)->top == -1)
{
return EMPTY;
}
return EMPTY_NO;
}
int push_stack(Stack ** stack,int num)
{
//判斷棧是否爲滿
if(is_full(stack) == FULL_OK)
{
printf("the stack is full\n");
return PUSH_ERROR;
}
//移動棧定指針
((*stack) -> top)++;
//壓入數據
((*stack) -> stack[(*stack)->top]) = num;
return PUSH_OK;
}
int pop_stack(Stack ** stack)
{
if(is_empty(stack) == EMPTY)
{
printf("the stack is empty\n");
return ;
}
return ((*stack)->stack[((*stack)->top)--]);
}
int main()
{
int i;
int ret;
Stack * stack = NULL;
//創建棧
creat_stack(&stack);
//初始化棧
init_stack(&stack);
//壓棧
for(i = 0; i < Max; i++)
{
if(push_stack(&stack,i+1) == PUSH_OK)
{
printf("push ok\n");
}
}
//出棧
for(i = 0; i < Max; i++)
{
ret = pop_stack(&stack);
if(ret == POP_NO)
{
break;
}
printf("第%2d次出棧值:%3d\n",i+1,ret);
}
return PUSH_OK;
}
/*****************************************************
Description:
鏈式棧實現
*****************************************************/
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
struct stack_data
{
int stack;
struct stack_data * next;
};
typedef struct stack_data Stack;
typedef struct stack_data * Link;
enum return_value {FULL_OK,FULL_NO,EMPTY_OK,EMPTY_NO,PUSH_OK};
void create_stack(Stack ** stack)
{
*stack = (Stack *)malloc(sizeof(Stack));
if( *stack == NULL)
{
printf("creat stack fail \n");
exit(-1);
}
}
void init_stack(Stack * stack)
{
stack -> next = NULL;
}
int is_empty(Stack * stack)
{
if(stack->next == NULL)
{
return EMPTY_OK;
}
return EMPTY_NO;
}
int push_stack(Stack * stack,Stack * new_node,int num)
{
Link temp = stack;
new_node->stack = num;
while(temp->next != NULL)
{
temp = temp->next;
}
temp->next = new_node;
new_node->next = NULL;
return PUSH_OK;
}
int pop_stack(Stack * stack)
{
Link temp = stack;
Link p = temp;
int num;
if (is_empty(stack) == EMPTY_OK )
{
printf("the stack is empty");
exit(-1);
}
while(temp->next != NULL)
{
p = temp;
temp = temp->next;
}
p->next = NULL;
num = temp -> stack;
free(temp);
temp = NULL;
return num;
}
int main()
{
Stack * stack;
Stack * new_node;
int i;
int ret;
//創建棧
create_stack(&stack);
//初始化棧
init_stack(stack);
for(i = 0; i< 10; i++)
{
//創建新節點
create_stack(&new_node);
//入棧(尾插形式)
ret = push_stack(stack,new_node,i);
if( ret == PUSH_OK)
{
printf("PUSH_OK\n");
}
}
for(i = 0; i < 10; i++)
{
ret = pop_stack(stack);
printf("第%d次出棧,出棧值 %d\n",i+1,ret);
}
return 0;
}