1. 程式人生 > >連結串列實現棧

連結串列實現棧

資料結構作業

#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; }