連結串列實現棧
阿新 • • 發佈:2018-12-19
資料結構作業
#include <stdio.h>
#include <malloc.h>
#include <iostream>
using namespace std;
typedef int SElemType;
typedef int Status;
#define INIT_SIZE 100
#define STACKINCREMENT 10
#define Ok 1
#define Error 0
#define True 1
#define False 0
typedef struct {
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
//初始化棧
Status InitStack(SqStack *s)
{
s->base = (SElemType *)malloc(INIT_SIZE * sizeof(SElemType));
if(!s->base) {
puts("儲存空間分配失敗!");
return Error;
}
s->top = s->base;
s->stacksize = INIT_SIZE;
return Ok;
}
//清空棧
Status ClearStack(SqStack *s){
s->top = s->base;
return Ok;
}
//棧是否為空
Status StackEmpty(SqStack *s) {
if(s->top == s->base) return True;
else return False;
}
//銷燬棧
Status Destroy(SqStack *s) {
free(s->base);
s->base = NULL;
s->top = NULL;
s->stacksize=0;
return Ok;
}
//獲得棧頂元素
Status GetTop(SqStack *s, SElemType &e) {
if(s->top == s->base) return Error;
e = *(s->top - 1);
return Ok;
}
//壓棧
Status Push(SqStack *s, SElemType e) {
if(s->top - s->base >= s->stacksize) { // 棧滿
s->base = (SElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!s->base) {
puts("儲存空間分配失敗!");
return Error;
}
s->top = s->base + s->stacksize;//修改棧頂位置
s->stacksize += STACKINCREMENT;//修改棧長度
}
*s->top++ = e;
return Ok;
}
//彈棧
Status Pop(SqStack *s, SElemType *e) {
if(s->top == s->base) return Error;
--s->top;
*e = *(s->top);
return Ok;
}
//遍歷棧
Status StackTraverse(SqStack *s,Status(*visit)(SElemType)) {
SElemType *b = s->base;//此處不能直接用base或top移動,即不能改變原棧的結構
SElemType *t = s->top;
while(t > b)
visit(*b++);
printf("\n");
return Ok;
}
Status visit(SElemType c) {
printf("%d ",c);
return Ok;
}
void menu() {
cout<<" menu:"<<endl;
cout<<"1.進棧"<<endl;
cout<<"2.出棧"<<endl;
cout<<"3.輸出"<<endl;
cout<<"4.menu"<<endl;
cout<<"0.結束"<<endl;
}
int main()
{
SqStack a ,*s = &a ;
SElemType e;
InitStack(s); menu();
int choose ,x ;
while(true){
cout<<"\n請選擇:";
cin >> choose;
int k = 0;
switch(choose){
case 1:
printf("請輸出需要進棧的個數:");
scanf("%d",&x);
printf("請輸入%d個元素:",x);
while(x--){
scanf("%d",&e);
Push(s,e);
}
break;
case 2:
Pop(s,&e);
printf("出棧的元素是:%d\n", e);
break;
case 3:
StackTraverse(s, visit);
printf("棧已全部輸出!\n");
break;
case 4:
menu();
break;
case 0:
k = 1;
break;
default:
printf("請重新輸入!");
break;
}
if(k) break;
}
Destroy(s);
return 0;
}