//假设有二个栈共同使用一块顺序存储的空间,为简单起见可设为共同使用数组 int |
//buffer[200]。它们的栈底分别设在数组的两端,而栈顶指针在进行插入操作时,向 |
//中间方向移动。请给出进出栈的程序. |
#include<stdio.h> |
#include<stdlib.h> |
#include"test3.h" |
#include<string.h> |
#define Maxsize 200 |
int main() |
{ |
int i,flat=1,len1,len2,n; |
char str[Maxsize],e; |
SqStack *A,*B; |
A=CreateSqStack(); //创建栈A |
B=CreateSqStack(); //创建栈B |
InitSqStackA(A); //初始化栈A |
InitSqStackB(B); //初始化栈B |
printf ( "对栈A输入一组字符:\n" ); |
gets (str); |
len1= strlen (str); //len1 用于存放栈A的数据元素的个数 |
for (i=0;i<len1;i++) |
{ |
flat=Judge(A,B); //判断存储空间是否已经满了,若满,则返回ERROR,否则,返回OK |
if (!flat) |
{ |
printf ( "存储空间已满!\n" ); |
return 0; |
} |
PushSqStackA(A,str[i]); //入栈A |
} |
printf ( "对栈B输入一组字符:\n" ); |
gets (str); |
len2= strlen (str); //len2 用于存放栈B的数据元素的个数 |
for (i=0;i<len2;i++) |
{ |
flat=Judge(A,B); //判断存储空间是否已经满了,若满,则返回ERROR,否则,返回OK |
if (!flat) |
{ |
printf ( "存储空间已满!\n" ); |
return 0; |
} |
PushSqStackB(B,str[i]); //入栈B |
} |
printf ( "对栈A输出几个数:\n" ); |
scanf ( "%d" ,&n); |
for (i=0;i<n;i++) |
{ |
PopSqStackA(A,&e); //出栈A |
printf ( "%c" ,e); |
} |
printf ( "\n" ); |
printf ( "对栈B输出几个数:\n" ); |
scanf ( "%d" ,&n); |
for (i=0;i<n;i++) |
{ |
PopSqStackB(B,&e); //出栈B |
printf ( "%c" ,e); |
} |
printf ( "\n" ); |
return 0; |
} |
/////////////////////////////////////// |
/* test.cp */ |
/* filename:test.cpp */ |
/* description:test.h的实现文件 */ |
/* designer:zhu jian */ |
/* data:12-10-26 */ |
/////////////////////////////////////// |
#include"stdio.h" |
#include"stdlib.h" |
#include"test3.h" |
#define Maxsize 200 |
SqStack *CreateSqStack( void ) //定义一个栈的指针 |
{ |
SqStack *S; |
S=(SqStack *) malloc ( sizeof (SqStack)); |
if (!S) |
return NULL; |
S->top=0; |
return S; |
} |
unsigned char InitSqStackA(SqStack *S) //初始化栈A |
{ |
SqStack *p; |
p=S; |
if (!S) |
return ERROR; |
S->top=0; |
return OK; |
} |
unsigned char InitSqStackB(SqStack *S) //初始化栈B |
{ |
SqStack *p; |
p=S; |
if (!S) |
return NULL; |
p->top=200; |
return OK; |
} |
unsigned char PushSqStackA(SqStack *S,elemtype e) //将数据元素插入栈A中(进栈) |
{ |
SqStack *p; |
p=S; |
if (!S) |
return ERROR; |
p->data[p->top]=e; |
p->top++; |
return OK; |
} |
unsigned char PushSqStackB(SqStack *S,elemtype e) //将数据元素插入栈B中(进栈) |
{ |
SqStack *p; |
p=S; |
if (!S) |
return ERROR; |
p->data[p->top-1]=e; |
p->top--; |
return OK; |
} |
unsigned char PopSqStackA(SqStack *S,elemtype *e) //出栈A |
{ |
SqStack *p; |
p=S; |
if (!S) |
return ERROR; |
if (p->top == 0) |
{ |
printf ( "栈A已空!\n" ); |
return ERROR; |
} |
*e=p->data[p->top-1]; |
p->top--; |
return OK; |
} |
unsigned char PopSqStackB(SqStack *S,elemtype *e) //出栈B |
{ |
SqStack *p; |
p=S; |
if (!S) |
return ERROR; |
if (p->top == Maxsize) |
{ |
printf ( "栈B已空!\n" ); |
return ERROR; |
} |
*e=p->data[p->top]; |
p->top++; |
return OK; |
} |
unsigned char Judge(SqStack *A,SqStack *B) //判断栈A与栈B是否已将空间占满 |
{ |
SqStack *p,*q; |
p=A; |
q=B; |
if (!A || !B) |
return ERROR; |
if (p->top < q->top ) |
return OK; |
else |
return ERROR; |
} |
/////////////////////////////////////// |
/* test.h */ |
/* filename:test.h */ |
/* description:test.h的头文件 */ |
/* designer:zhu jian */ |
/* data:12-10-26 */ |
/////////////////////////////////////// |
#ifndef _DATA_STRUCTURE_TEST_H_ |
#define _DATA_STRUCTURE_TEST_H_ |
#ifndef ERROR |
#define ERROR 0 |
#endif |
#ifndef OK |
#define OK 1 |
#endif |
#ifndef NULL |
#define NULL 0 |
#endif |
#define Maxsize 200//定义最大数据元素量是200 |
typedef char elemtype; //定义用elemtype取代char |
typedef struct { //定义栈的结构体 |
elemtype data[Maxsize]; |
int top; |
}SqStack; |
SqStack *CreateSqStack( void ); //定义一个栈的指针 |
unsigned char InitSqStackA(SqStack *S); //初始化栈A |
unsigned char InitSqStackB(SqStack *S); //初始化栈B |
unsigned char PushSqStackA(SqStack *S,elemtype e); //将数据元素插入栈A中(进栈) |
unsigned char PushSqStackB(SqStack *S,elemtype e); //将数据元素插入栈B中(进栈) |
unsigned char PopSqStackA(SqStack *S,elemtype *e); //出栈A |
unsigned char PopSqStackB(SqStack *S,elemtype *e); //出栈B |
unsigned char Judge(SqStack *A,SqStack *B); //判断栈A与栈B是否已将空间占满 |
#endif |