摘要:如题,基本思路是:让数组的两边分布为栈的底部。这样对栈的利用率可以达到100%。
#include "stdafx.h"
#include "malloc.h"
#include "stdlib.h"
#define stack1 1
#define stack2 2
typedef struct StackRecord *Stack;
struct StackRecord
{
int capcity;
int *Array;
int Top1,Top2;
};
Stack Create(int size)
{
Stack S;
S = (Stack)malloc(sizeof(StackRecord));
S ->Array = (int *)malloc(sizeof(int)*size);
S->capcity = size;
S->Top1 = -1;
S->Top2 = size;
return S;
}
void Push(Stack S,int x,int flag)
{
if(S->Top1 >= S->Top2 - 1){
//栈未满
puts("cannot push element into a full stack");
system("pause");
exit(-1);
}
if (flag == stack1)
S->Array[++S->Top1] = x;
else if (flag == stack2)
S->Array[--S->Top2] = x;
else
puts("the flag is wrong");
return;
}
int Pop(Stack S,int flag)
{
if (flag == stack1)
{
if (S->Top1 == -1){
puts("cannot pop an empty stack");
system("pause");
exit(-1);
}
else
return(S->Array[S->Top1--]);
}
else if (flag == stack2)
{
if (S->Top2 == S->capcity)
{
puts("cannot pop an empty stack");
system("pause");
exit(-1);
}
else
return(S->Array[S->Top2++]);
}
else
puts("the flag is wrong");
exit(-1);
}
void print(Stack S,int flag)
//输出所有元素
{
if (flag == stack1){
while(S->Top1 != -1)
printf("%d ",Pop(S,flag));
return;
}
if (flag == stack2){
while(S->Top2 != S->capcity)
printf("%d ",Pop(S,flag));
return;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int i;
Stack S;
S = Create(30);
for(i = 1;i<=10;i++)
{
Push(S,i,stack1);
Push(S,i+10,stack2);
}
print(S,stack1);
print(S,stack2);
return 0;
}