殷人昆顺序栈基本操作

// 殷人昆顺序栈c第2版.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;
#define initSize 4
typedef int elemtype;
typedef int datatype;
typedef struct {
    elemtype* elem;
    int maxsize, top;
}seqstack;
void init(seqstack& s)
{
  //  s.elem = (elemtype*)malloc(initSize*sizeof(elemtype));
     s.elem = (elemtype*)calloc(initSize,sizeof(elemtype));
    if (s.elem == NULL)
    {
        cout << "存储分配失败" << endl;
        exit(1);
    }
    s.maxsize = initSize; s.top = -1;
}
int push(seqstack& s, datatype x)
{
   if (s.top ==s.maxsize - 1)//条件表达式,我写成了赋值表达式----
    {
      
       elemtype* newbase = (elemtype*)realloc(s.elem,(s.maxsize + 100) * sizeof(elemtype));
       //我错写成::s.elem = (elemtype*)realloc(s.elem,(s.maxsize + 100) * sizeof(elemtype));
       //为什么赋给newbase,因为可能分配不成功,若赋给s.elem分配不成功时,把原来的也弄丢了
       if (!newbase)exit(1);
       
       s.elem = newbase;//上面3句见严蔚敏数据结构教材---线性表24页---当前存储空间已满,增加分配
     

        s.top =s.maxsize-1 ;
     //   cout << s.top << endl;
        s.maxsize+=100;   
      //  cout << s.maxsize;
    }
       
    s.elem[++s.top] = x;
    return 1;
}
int pop(seqstack& s,elemtype& x)
{
    if (s.top == -1)return 0;
    x = s.elem[s.top];
    s.top--;
    return 1;
}
int gettop(seqstack& s, elemtype& x)
{
    if (s.top == -1)return 0;
    x = s.elem[s.top];
    return 1;
}
int empty(seqstack& s)
{
    return s.top == -1;
}
int full(seqstack& s)
{
    return s.maxsize -1== s.top;
}
int stacksize(seqstack& s)
{
  //  cout << s.top;
    return s.top + 1;
}
void reverse(elemtype a[],int n)
{
    seqstack s;
    init(s);
    for (int i = 1; i <= n; i++)
        push(s, a[i - 1]);

    int i = 0;
    while (!empty(s))
    {
        pop(s, a[i++]);
    }
        
}
int main()
{
    int a[5] = {1,2,3,4,5};
    reverse(a,5);
    for (int i = 0; i < 5; i++)
        cout << a[i] << "  ";
    /*seqstack s;
    init(s);
    for (int i = 1; i <= 4; i++)
        push(s, i);
    
    std::cout << "Hello World!\n";
    elemtype x;

    cout << s.top << endl;
  //  gettop(s, x);
   // cout << x;

    std::cout << "Hello World!\n";
   
   push(s,5);
   cout << stacksize(s) << endl;
   // cout << full(s) << endl;*/
}

知识点总结:

(1)realloc重新分配

int push(seqstack& s, datatype x)
{
   if (s.top ==s.maxsize - 1)//条件表达式,我写成了赋值表达式----
    {
      
       elemtype* newbase = (elemtype*)realloc(s.elem,(s.maxsize + 100) * sizeof(elemtype));
       //我错写成::s.elem = (elemtype*)realloc(s.elem,(s.maxsize + 100) * sizeof(elemtype));
       //为什么赋给newbase,因为可能分配不成功,若赋给s.elem分配不成功时,把原来的也弄丢了
       if (!newbase)exit(1);
       
       s.elem = newbase;//上面3句见严蔚敏数据结构教材---线性表24页---当前存储空间已满,增加分配
     

        s.top =s.maxsize-1 ;
     //   cout << s.top << endl;
        s.maxsize+=100;   
      //  cout << s.maxsize;
    }
       
    s.elem[++s.top] = x;
    return 1;
}

(2)top是最后加入元素的存储位置。进栈时,应先检查栈是否为满。栈允许存放最后的位置为maxsize-1;;top==maxsize-1则说明栈满。

若有新元素进栈,会发生栈溢出,程序会利用realloc再次申请空间。top<maxsize-1,则top+1,可以进栈

(3)另一个极端情况出现在栈底:如果栈空即top==-1,则退栈操作执行栈空处理。栈空处理一般不是出错处理,而是使用这个栈的算法结束时需要执行的处理。。若当前top>=0,栈顶指针减1,等于栈顶退回到次栈顶位置

殷人昆c++第3版83页  和和殷人昆c第2版69页

退栈时栈空不是错误,而是使用栈的某种处理结束,执行栈空处理;;;进栈时满栈,需要做溢出处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值