#include#include #include #define MaxSizeArray 16//该程序的缺陷之处:调用CreateStack(int MaxSize)函数时,需与MaxSize保持一致(重在理解堆栈,哈哈) //用一个数组实现两个堆栈 typedef struct DStack *Stack; typedef int Position; struct DStack { int *Data;//存储元素的数组 Position Top1;//堆栈1的顶部指针 Position Top2;//堆栈2的顶部指针,也可以说是堆栈的最大容量 }; //创建一个空的堆栈 Stack CreateStack(int MaxSize) { //为所创造的DStack栈分配内存 Stack S = (Stack)malloc(sizeof(struct DStack)); //为数组分配内存 S->Data = (int *)malloc(MaxSize * sizeof(int)); S->Top1 = -1; S->Top2 = MaxSize; return S; } //判断栈是否为空 bool IsEmpty(Stack PtrS) { return PtrS->Top1 == -1; } //判断栈是否为空 bool IsFull(Stack PtrS) { return PtrS->Top2 - PtrS->Top1 == 1; } //push操作 void Push(Stack PtrS, int item, int Tag) { if(IsFull(PtrS)) { printf("堆栈满"); return; } if (Tag == 1) //对第一个栈进行操作 PtrS->Data[++(PtrS->Top1)] = item; else//对第二个栈进行操作 PtrS->Data[--(PtrS->Top2)] = item; } //pop操作 int Pop(Stack PtrS,int Tag) { if (Tag == 1) {//对同一个数组中的其中一个堆栈1进行操作 if(IsEmpty(PtrS)) { printf("堆栈1空"); return NULL; } else { return PtrS->Data[(PtrS->Top1)--]; } } else { if(PtrS->Top2 == MaxSizeArray) {//对同一个数组中的其中一个堆栈2进行操作 printf("堆栈2空"); return NULL; } else { return PtrS->Data[(PtrS->Top2)++]; } } } //编写一个测试函数 void ShowStack(Stack S,int tag) { Position temp; if(tag == 1) { temp = S->Top1; for(int i = temp; i >= 0; i--) { printf("下标为%d的值为:%dn",i,S->Data[i]); } } else { temp = S->Top2; for(int i = temp; i < MaxSizeArray; i++) { printf("下标为%d的值为:%dn",i,S->Data[i]); } } } int main(void) { Stack S = CreateStack(16); //对堆栈1进行操作 Push(S,1,1); Push(S,2,1); Push(S,3,1); Push(S,4,1); //对堆栈2进行操作 Push(S,16,2); Push(S,15,2); Push(S,14,2); Push(S,13,2); // StackTest(Stack S,int tag)---显示堆栈 //push--test printf("pop--test"); printf("堆栈1为:n"); ShowStack(S,1); printf("n堆栈2为:n"); ShowStack(S,2); //pop--test printf("npop--testn"); Pop(S,1);//将下标为3所在元素Pop出去 ShowStack(S,1); Pop(S,1);//将下标为2所在元素Pop出去 Pop(S,1);//将下标为1所在元素Pop出去 printf("n只剩一个元素,将其显示n"); ShowStack(S,1); Pop(S,1);//将下标为0所在元素Pop出去 ShowStack(S,1); printf("n报堆栈1空的提示n"); Pop(S,1);//堆栈1中没有元素,报--堆栈1空--的提示 return 0; }
测试结果:
pop--test堆栈1为: 下标为3的值为:4 下标为2的值为:3 下标为1的值为:2 下标为0的值为:1 堆栈2为: 下标为12的值为:13 下标为13的值为:14 下标为14的值为:15 下标为15的值为:16 pop--test 下标为2的值为:3 下标为1的值为:2 下标为0的值为:1 只剩一个元素,将其显示 下标为0的值为:1 报堆栈1空的提示 堆栈1空 -------------------------------- Process exited after 0.0282 seconds with return value 0 请按任意键继续. . .



