zoukankan      html  css  js  c++  java
  • 数据结构—链表实现栈

    数据结构作业

    #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("
    "); 
    	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<<"
    请选择:";
            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
    ", e);
                    break;
                case 3:
                    StackTraverse(s, visit);
                    printf("栈已全部输出!
    ");
                    break;
                case 4:
                    menu();
                    break;
                case 0:
                    k = 1;
                    break;
                default:
                    printf("请重新输入!");
                    break;
            }
            if(k)   break;
        }
        Destroy(s);
        return 0;
    }
    
    
  • 相关阅读:
    APICloud学习笔记之Click事件优化
    APICloud学习笔记之doT模板
    APICloud学习笔记之上拉加载
    APICloud学习笔记之下拉刷新
    5. JavaScript 正则表达式
    4. JavaScript 控制语句
    3. JavaScript 数据类型
    2. 语法
    1.开篇
    C++内存申请容易产生的错误
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11745925.html
Copyright © 2011-2022 走看看