C语言堆栈中如何 创建 销毁 压栈 弹栈 判空 置空 计数

C语言实验作业关于堆栈的,我完全不知道从何下手啊!跪求高手帮忙解决,我把我所有的分都拿出来了!!
以下是作业要求:

栈(stack)又名堆栈,它是一种运算受限的线性表。

其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。


这里是C++源码,供参考。

#include<iostream>

using namespace std;

const int Max=100;

template <class T> 
class MyStack
{
    private:
            T *aa;
            unsigned int p;
    public :
           void init();
           bool isEmpty();
           T pop();
           void push(const T a);
           unsigned int size();
           void destroy();
                  
};

template <class T> 
void MyStack<T>::init()
{
      aa = new T[Max+1];
      p=0;
      return;    
};

template <class T> 
bool MyStack<T>::isEmpty()
{
      if(p==0) return true;
      else     return false;
};


template <class T> 
unsigned int MyStack<T>::size()
{
      return p;
};


template <class T> 
void MyStack<T>::push(const T a)
{
      p=p+1;
      aa[p]=a;    
};

template <class T> 
T MyStack<T>::pop()
{
       
      char t=aa[p];
      p=p-1; 
      cout << t << endl;
      return t;     
};

template <class T> 
void MyStack<T>::destroy()
{
       
      delete[] aa;
};

int main()
{
    
    MyStack<char> st;
    st.init();
    if(st.isEmpty()) cout << "MyStack is empty" << endl;
    else cout <<"MyStack is not empty" << endl;
    st.push('a');
    st.push('b');
    st.push('c');
    st.push('d');
    st.push('e'); 
    cout<< st.size()<<endl;
    
    while(!st.isEmpty()) st.pop();
    st.destroy();
    system("pause");
    return 0;
}


温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-07
/*
这是我以前写的、、应付作业应该没问题、、不过好像没记数和销毁功能、、而且我也不知道lz说的记数和销毁是什么意思、、如果要改的话,请说下记数和销毁是什么意思、、
*/

#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"


//节点
struct Node
{
int date; //数据
struct Node* pNext; //用于指向上一个元素的地址
};


//栈
struct Strack
{
struct Node* save; //保存最上面一个元素的地址
struct Node* pTop; //顶部指针
struct Node* pBottom; //底部指针
void initStrack(struct Strack* p); //初始化栈
void pushNode(struct Strack* p, int date); //添加节点
void deleteNode(struct Strack* p); //删除节点
void coutStarckDate(struct Strack* p); //输出栈中所有的数据
void cleanStrack(struct Strack* p); //清空栈中的所有元素
};


void Strack::initStrack(struct Strack* p)
{
//1、生成一个无用的头节点, 并用pBottom指向它
p->pBottom = (Node* )malloc(sizeof(Node));

//2、判断内存是否分配成功
if (p->pBottom == NULL)
{
printf("内存分配失败!\n");
exit(-1);
}
//3、如果内存分配成功,则让pTop也指向这个头节点
else
{
printf("内存分配成功!头节点已生成,并且“底部指针”和“顶部指针”都指向它\n");
p->pTop = p->pBottom;

//这里弄成Null是因为coutStarckDate函数里要判断最后一个节点的地址为Null才停止输出
p->pBottom->pNext = NULL; 
}
};


void Strack::pushNode(struct Strack* p, int date)
{
//1、创建一个新的节点
Node* node = (Node* )malloc(sizeof(Node));

//2、给新节点的date赋值
node->date = date;

//3、新节点的pNext指向上一个节地址
node->pNext = p->pTop;

//4、pTop指向新的节点地址
p->pTop = node;
};


void Strack::coutStarckDate(struct Strack* p)
{
//输出的时候保存最上面的一个元素的地址
p->save = p->pTop;

printf("栈中所有的元素\n");

//指的是数据的pNext是否为NULL
while (p->pTop->pNext != NULL)
{
printf("%d\n", *p->pTop);

//把“pTop”指向下一个数据的地址
p->pTop = p->pTop->pNext;
}

//输出完毕后把pTop指向最上面一个元素的地址,不然的话,在执行出栈的时候会因为p->pTop == p->pBottom而提示无元素删除的错误。
p->pTop = p->save;
}


void Strack::deleteNode(struct Strack* p)
{
if (p->pTop == p->pBottom)
{
printf("栈中已经没有元素了、、无法进行删除操作\n");
}
else
{
/*
这里只所以要定义一个临时变量temp, 是因为如果我们直接把pTop指针指向下一个节点,就会失去了最上面一个节点的地址。
这样的话就无法释放最上面一个节点的内存了。
*/
printf("被出栈的元素是:%d\n", *p->pTop);

//定义一个临时变量,这个临时变量也指向最上面的一个元素
Node* temp = p->pTop;

//pTop指向当前节点指向的下一个节点的地址
p->pTop = p->pTop->pNext;

//释放最上面一个节点
free(temp);
temp = NULL;
}
}


void Strack::cleanStrack(struct Strack* p)
{
while (p->pTop != p->pBottom)
{
Node* temp = p->pTop;
p->pTop = p->pTop->pNext;
free(temp);
temp = NULL;
}
printf("已把栈中所有的元素删除\n");
}


int main(void)
{
struct Strack strack;

strack.initStrack(&strack);

strack.pushNode(&strack, 3);
strack.pushNode(&strack, 30);
strack.pushNode(&strack, 300);
strack.pushNode(&strack, 3000);

//strack.cleanStrack(&strack);

strack.coutStarckDate(&strack);

return 0;
}

追问

我们的是链栈不是顺序栈啊,没有用到top和bottom。销毁就是把栈给销毁了,计数就是栈帧个数

追答

你说的是链表??

追问

嗯嗯

追答

链表没学过呢、、sorry、、

本回答被网友采纳
第2个回答  2013-12-07

文档已上传,我自己写的,求采纳