顺序栈 、链栈
顺序栈基本操作:
#include<stdio.h>
#include<stdlib.h>
#define SElemType int
#define maxsize 100
#define Status int
//如果实参传递的是一个地址,那么形参接收后对其本身进行更改
//如果实参传递的是一个变量,那么形参接受后是对他的副本作修改
//如果实参传递的是变量,但形参接受时是 “&变量” 这种形式,那么接收到的还是这个变量的地址,修改是对其本身数据更改
typedef struct{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
Status InitStack(SqStack &S){
S.base = new SElemType[maxsize]; ///构建了一个大小为maxsize的内存空间,相当于是一个数组,只能存储SElemType的数据类型,并将基地址赋值给了base指针
if(!S.base) {
printf("内存分配失败!\n");
return 0;
}
S.top = S.base;
S.stacksize = maxsize;
return 1;
}
Status PushElem(SqStack &S,SElemType e){
//插入元素e为新的栈顶元素
if(S.top-S.base==S.stacksize){
return 0;
}
*S.top++ = e;
return 1;
}
Status PopElem(SqStack &S,SElemType &e){
if(S.top == S.base) return 0;
e = *(--S.top);
return 1;
}
void Push(SqStack &S){
int num;
int flag;
SElemType e;
printf("请输入你要插入的元素的个数:\n");
scanf("%d",&num);
for(int i =0;i<num;i++){
printf("请输入第%d位元素\n",i+1);
scanf("%d",&e);
flag = PushElem(S,e);
if(flag)
{
printf("%d已入栈!\n",e);
}
else{
printf("栈已满!\n");break;
}
}
}
void Pop(SqStack &S){
int num;
int flag;
SElemType e;
printf("请输入你要出栈的元素个数:\n");
scanf("%d",&num);
for(int i =0;i<num;i++){
flag = PopElem(S,e);
if(flag)
{
printf("%d已出栈!\n",e);
}
else{
printf("栈已空!\n");break;
}
}
}
void GetTop(SqStack &S){
//返回S 的栈顶元素,不修改栈顶指针
if(S.top!=S.base)
{
printf("栈顶元素为%d\n",*(S.top-1));
}
}
menu(){
printf("***************\n");
printf("1.入栈\n");
printf("2.出栈\n");
printf("3.取栈顶元素\n");
printf("4.退出\n");
printf("***************");
}
int main(){
SqStack S;
InitStack(S);
while(1){
menu();
int choice;
printf("请选择操作菜单:\n");
scanf("%d",&choice);
if(choice == 4) break;
switch(choice){
case 1:Push(S); break;
case 2:Pop(S); break;
case 3:GetTop(S);break;
default:printf("输入错误!!\n");
}
}
return 0;
}
链栈基本操作:
#include<stdio.h>
#include<stdlib.h>
#define SElemType int
#define maxsize 100
#define Status int
typedef struct StackNode{
SElemType data;
struct StackNode *next;
}StackNode,*LinkStack;
Status InitStack(LinkStack &S){
//构造一个空栈S,栈顶指针为空,栈链没有头结点
S = NULL;
return 1;
}
Status PushElem(LinkStack &S,LinkStack &p,SElemType &e){
p = new StackNode;
p->data = e;
p->next = S;
S = p;
return 1;
}
Status PopElem(LinkStack &S,LinkStack &p,SElemType &e){
if(S==NULL) return 0; //栈空
e = S->data;
p = S;
S = S->next;
free(p);
return 1;
}
void Push(LinkStack &S,LinkStack &p){
int flag;
int n;
SElemType e;
printf("请输入你要入栈几个数据:\n");
scanf("%d",&n);
for(int i = 0;i<n;i++){
printf("请输入你要插入的第%d的数据是:\n",i+1);
scanf("%d",&e);
PushElem(S,p,e);
if(flag){
printf("%d入栈成功!\n",e);
}else{
printf("入栈失败!\n");
}
}
}
void Pop(LinkStack &S,LinkStack &p){
int num;
int flag;
SElemType e;
printf("请输入你要出栈的元素个数:\n");
scanf("%d",&num);
for(int i =0;i<num;i++){
flag = PopElem(S,p,e);
if(flag)
{
printf("%d已出栈!\n",e);
}
else{
printf("栈已空!\n");break;
}
}
}
void GetTop(LinkStack &S){
if(S!=NULL){
printf("栈顶元素为%d\n",S->data);
}
}
menu(){
printf("***************\n");
printf("1.入栈\n");
printf("2.出栈\n");
printf("3.取栈顶元素\n");
printf("4.退出\n");
printf("***************");
}
int main(){
LinkStack S;
LinkStack p;
InitStack(S);
while(1){
menu();
int choice;
printf("请选择操作菜单:\n");
scanf("%d",&choice);
if(choice == 4) break;
switch(choice){
case 1:Push(S,p); break;
case 2:Pop(S,p); break;
case 3:GetTop(S);break;
default:printf("输入错误!!\n");
}
}
return 0;
}