// Stack.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include "stdio.h"

#include "stdlib.h"

//*

 #define STACK_MAX_SIZE 7

 int StackData[STACK_MAX_SIZE] = {'A','B','C','D','E','F','G'};

//*/

/*

 #define STACK_MAX_SIZE 14

 int StackData[STACK_MAX_SIZE] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N'};

*/

/*顺序栈类型定义*/

typedef struct

{

 int data[STACK_MAX_SIZE];

 int top;

}sqStack;

/*链栈类型定义*/

struct LinkStack

{

 int data;

 struct LinkStack *link;

};

typedef struct LinkStack lkStack;

/*顺序栈基本操作函数定义部分*/

void sqInitialize(sqStack *stack)

{

 stack->top = 0; 

}

int sqIsEmpty(sqStack *stack)

{

 if(stack->top == 0)

  return(1);

 else

  return(0);

}

int sqIsFull(sqStack *stack)

{

 if(stack->top >= STACK_MAX_SIZE)

  return(1);

 else

  return(0);

}

int sqPush(sqStack *stack,int data)

{

 if(sqIsFull(stack))

 {

  printf("堆栈已満!\n");

  return(0);

 }

 else

 {

  stack->data[stack->top++] = data;

  return(1);

 }

}

int sqPop(sqStack *stack,int *p)

{

 if(sqIsEmpty(stack))

 {

  printf("堆栈已空!\n");

  return(0);

 }

 else

 {

  *p = stack->data[--stack->top];

  return(1);

 }

}

int sqGetTop(sqStack *stack,int *p)

{

 if(sqIsEmpty(stack))

 {

  printf("堆栈已空!\n");

  return(0);

 }

 else

 {

  *p = stack->data[stack->top];

  return(1);

 }

}

void sqWriteValue(sqStack *stack,int array[],int n)

{

 int i;

 for(i=0;i<n;i++)

  if(sqPush(stack,array[i])) printf("Stack[%d] = %c\t",stack->top-1,array[i]);

}

void sqPrintValue(sqStack *stack)

{

 int StackData,i;

 i=0;

 while(sqPop(stack,&StackData))

  printf("Stack[%d] = %c\t",stack->top,StackData);

 printf("\n");

}

/*链栈基本操作函数定义部分*/

void lkInitialize(lkStack *top)

{

 top = NULL;

}

int lkIsEmpty(lkStack *top)

{

 if(top == NULL)

  return(1);

 else

  return(0);

}

int lkPush(lkStack  *top,int data)

{

 lkStack  *q;

 q = (lkStack  *)malloc(sizeof(lkStack));

 if(q==NULL)

  return(0);

 else

 {

  q->data = data;

  q->link = NULL;

  top->link = q;

  top = q;

  return(1);

}

int lkPop(struct LinkStack  *stack,int *p)

{

 struct LinkStack  *q;

 if(lkIsEmpty(stack))

 {

  printf("堆栈已空!\n");

  return(0);

 }

 else

 {

  q = stack;

  *p = stack->data;

  stack = stack->next;

  //free(q);

  return(1);

 }

}

int lkGetTop(struct LinkStack  *stack,int *p)

{

 if(lkIsEmpty(stack))

 {

  printf("堆栈已空!\n");

  return(0);

 }

 else

 {

  *p = stack->data;

  return(1);

 }

}

void lkWriteValue(struct LinkStack  *stack,int n)

{

 int i;

 for(i=0;i<n;i++)

  if(lkPush(stack,i*10)) printf("Stack[%d] = %d\t",i,i*10);

}

void lkPrintValue(struct LinkStack  *stack,int n)

{

 int StackData,i;

 i=0;

 for(i=0;i<n;i++)

 {

  lkPop(stack,&StackData);

  printf("Stack[%d] = %d\t",i++,StackData);

 }

 printf("\n");

}

int main(int argc, char* argv[])

{

 sqStack *stack1;

 struct LinkStack  *stack2;

  //顺序栈处理部分

 sqInitialize(stack1);

 printf("\n顺序栈[入栈]数据.........\n");

 sqWriteValue(stack1,StackData,STACK_MAX_SIZE);

 printf("\n顺序栈[出栈]数据.........\n");

 sqPrintValue(stack1);

 /*

 //链栈处理部分

 lkInitialize(stack2);

 printf("\n链栈入栈数据.........\n");

 lkWriteValue(stack2,10);

 printf("\n链栈出栈数据.........\n");

 lkPrintValue(stack2,10);

 */

 return 0;

}