#include<stdio.h>
#include <stdlib.h>
typedef struct stackNode
{
int data;
struct stackNode *next;
}sNode;
typedef struct myStack
{
sNode *bottom;
sNode *top;
}myStack;
//建立栈
myStack* createStack()
{
myStack *s = (myStack*)malloc(sizeof(myStack));
s->bottom = NULL;
s->top = NULL;
return s;
}
//入栈
void pushStack(myStack *s,int i)
{
sNode *node;
node = (sNode*)malloc(sizeof(sNode));
node->data = i;
if(s->bottom == NULL)
{
s->bottom = node;
s->top = node;
node->next = NULL;
}else{
node ->next = s->top;
s->top = node;
}
}
//出栈
int popStack(myStack *s)
{
sNode *node;
int out;
if(s->bottom == NULL)
{
printf("the is stack is empty. \n");
return 0;
}
if(s->bottom == s->top)
{
node = s->top;
out = node ->data;
s->bottom = NULL;
s->top = NULL;
free(node);
return out;
}
node = s->top;
out = node ->data;
s->top = node->next;
free(node);
return out;
}
//从栈顶开始顺序打印栈
void printStack(myStack *s)
{
sNode *p;
p = s->top;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
}
void main()
{
myStack *s;
int i,p;
s = createStack();
for(i=1;i<=10;i++)
pushStack(s,i);
for(i=1;i<=13;i++)
{
p = popStack(s);
printf("pop data is: %d \n", p);
}
printStack(s);
}
使用两个栈模拟队列:
#include<stdio.h>
#include <stdlib.h>
typedef struct stackNode
{
int data;
struct stackNode *next;
}sNode;
typedef struct myStack
{
sNode *bottom;
sNode *top;
}myStack;
typedef struct stackQueue
{
myStack *inStack;
myStack *outStack;
}sQueue;
//建新栈
myStack* createStack()
{
myStack *s = (myStack*)malloc(sizeof(myStack));
s->bottom = NULL;
s->top = NULL;
return s;
}
//入栈
void pushStack(myStack *s,int i)
{
sNode *node;
node = (sNode*)malloc(sizeof(sNode));
node->data = i;
if(s->bottom == NULL)
{
s->bottom = node;
s->top = node;
node->next = NULL;
}else{
node ->next = s->top;
s->top = node;
}
}
//出栈
int popStack(myStack *s)
{
sNode *node;
int out;
if(s->bottom == NULL)
{
printf("the is stack is empty. \n");
return 0;
}
if(s->bottom == s->top)
{
node = s->top;
out = node ->data;
s->bottom = NULL;
s->top = NULL;
free(node);
return out;
}
node = s->top;
out = node ->data;
s->top = node->next;
free(node);
return out;
}
//从栈顶开始顺序打印栈
void printStack(myStack *s)
{
sNode *p;
p = s->top;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
}
//建立新队列,由两个栈构成
sQueue* createStackQueue()
{
sQueue *q;
myStack *inStack,*outStack;
q = (sQueue*)malloc(sizeof(sQueue));
inStack = createStack();
outStack = createStack();
q->inStack = inStack;
q->outStack = outStack;
return q;
}
//入队列
void inQueue(sQueue *q , int i)
{
pushStack(q->inStack,i);
}
//出队列
int outQueue(sQueue *q)
{
int outData,temp;
if(q->outStack->bottom != NULL)
{
outData = popStack(q->outStack);
return outData;
}else if(q->inStack->bottom != NULL)
{
while(q->inStack->bottom != NULL)
{
temp = popStack(q->inStack);
pushStack(q->outStack,temp);
}
outData = popStack(q->outStack);
return outData;
}else{
printf("\n the queue is empty \n");
return -1;
}
}
void main()
{
sQueue *q;
int i,out;
q = createStackQueue();
for(i=1;i<=10;i++)
inQueue(q,i);
for(i=1;i<=5;i++)
{
out = outQueue(q);
printf("%d ",out);
}
printf("\n");
for(i=11;i<=15;i++)
inQueue(q,i);
for(i=1;i<=7;i++)
{
out = outQueue(q);
printf("%d ",out);
}
printf("\n");
}