main.c
#include <stdio.h>
#include <stdlib.h>
#include "linkedstack.h"
bool is_stack_in_out(int in[],int out[],int n){
LinkedStack stack = linked_stack_create();
int i,j=0;
int top = 0;
for(i=0;i<n;i++){
linked_stack_push(stack,in[i]);
while(!linked_stack_empty(stack)){
linked_stack_top(stack,&top);
if(top == out[j]){
linked_stack_pop(stack,NULL);
++j;
}else{
break;
}
}
}
bool ret = linked_stack_empty(stack);
linked_stack_destroy(stack);
return ret;
}
int main(int argc, char *argv[]) {
int in[5] = {1,2,3,4,5};
int out[5] = {};
printf("请输入[1-5]序列:");
int i;
for(i=0;i<5;i++){
scanf("%d",&out[i]);
}
if(is_stack_in_out(in,out,5)){
printf("Right!\n");
}else{
printf("Not!\n");
}
return 0;
}
linkedstack.h
#ifndef _LINKED_STACK_H__
#define _LINKED_STACK_H__
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct Node{
int data;
struct Node *next;
}Node,*LinkedStack;
#define NODESIZE sizeof(struct Node)
LinkedStack linked_stack_create(void);
bool linked_stack_empty(LinkedStack stack);
size_t linked_stack_size(LinkedStack stack);
int linked_stack_push(LinkedStack stack,int data);
int linked_stack_pop(LinkedStack stack,int *pdata);
int linked_stack_top(LinkedStack stack,int *pdata);
void linked_stack_destroy(LinkedStack stack);
#endif
linkedstack.c
#include "linkedstack.h"
LinkedStack linked_stack_create(void){
LinkedStack stack = (LinkedStack)malloc(NODESIZE);
if(stack!=NULL){
stack->next = NULL;
}
return stack;
}
bool linked_stack_empty(LinkedStack stack){
return stack->next == NULL;
}
size_t linked_stack_size(LinkedStack stack){
size_t size = 0;
struct Node *node = stack->next;
while(node!=NULL){
++size;
node = node->next;
}
return size;
}
int linked_stack_push(LinkedStack stack,int data){
struct Node *node = (struct Node *)malloc(NODESIZE);
if(node == NULL)
return -1;
node->data = data;
node->next = stack->next;
stack->next = node;
return 0;
}
int linked_stack_pop(LinkedStack stack,int *pdata){
if(stack->next == NULL)
return -1;
if(pdata != NULL)
*pdata = stack->next->data;
struct Node *node = stack->next;
stack->next = node->next;
free(node);
return 0;
}
int linked_stack_top(LinkedStack stack,int *pdata){
if(stack->next == NULL)
return -1;
*pdata = stack->next->data;
return 0;
}
void linked_stack_destroy(LinkedStack stack){
while(!linked_stack_empty(stack))
linked_stack_pop(stack,NULL);
free(stack);
}