C语言实现堆栈数据结构的问题

jk88811 2005-05-09 10:59:42
我这里写好一个顺序存储的堆栈, 写得好菜, 请高手指点:

/* Stack.h */
#ifndef STACK_H
#define STACK_H

#define STACK_MAX_SIZE 100 /* 堆栈最大存储空间 */

typedef int ElemType; /* 数据元素类型 */

typedef struct {
ElemType data[STACK_MAX_SIZE]; /* 为栈分配一个数组 */
int top; /* 栈顶"指针" */
} Stack;

/*---------堆栈基本操作的函数定义----------*/

/* 置S为空栈 */
void InitStack(Stack *s)
{
s->top = -1;
}

/* 判断是否空栈, 是则返回1, 否则返回0 */
int IsEmpty(Stack *s)
{
return s->top == -1;
}

/* 判断是否满栈, 是则返回1, 否则返回0 */
int IsFull(Stack *s)
{
return s->top == STACK_MAX_SIZE - 1;
}

/* 进栈, 成功返回1, 否则返回0 */
int Push(Stack *s, ElemType x)
{
if (IsFull(s)) return 0;
s->data[++s->top] = x;
return 1;
}

/* 出栈, 返回栈顶元素 */
void Pop(Stack *s)
{
return s->data[s->top--];
}

/* 返回栈顶元素 */
ElemType GetTop(Stack *s)
{
return s->data[s->top];
}

#endif

上面的堆栈有几个问题没法解决, 像存储空间不够, 出栈函数Pop()不能返回出错时的情况.....

烦请大家如果有堆栈相关的代码贴出来让小弟学习一下,链式堆栈, 顺序堆栈都可以

没代码也请尽量提出建议和思路!!!

谢谢
...全文
701 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
du51 2005-05-10
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define OVERFLOW 1
#define ERROR 1
#define OK 0
#define STACKINCREMENT 10

typedef struct {
char* base;
char* top;
int stacksize;
}SqStack;

void InitStack(SqStack *S){
S->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));
if(!S->base)exit(OVERFLOW);
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
}

int Push(SqStack *S,char e){
if(S->top-S->base>=S->stacksize){
S->base=(char*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(char));
if(!S->base)exit(OVERFLOW);
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
*S->top++=e;
return OK;
}

int Pop(SqStack *S){
char e;
if(S->top==S->base)
{
printf("\nempty stack");
return ERROR;
}

e=*(--S->top);
printf("\npop a element:%c",e);
return OK;
}

char GetTop(SqStack *S){
char e;
if(S->top==S->base)return OK;
e=*(S->top-1);
return e;
}

int DestroyStack(SqStack *S){
SqStack *p;
if(S->base==S->top)return ERROR;
while(p!=S->base)
{
p=--S->top;
free(p);
}
free(S->base);
printf("\ndestroy the stack now");
return OK;
}

int main(void)
{ char c;
SqStack *x;
InitStack(x);
Push(x,'A');
Push(x,'B');
Push(x,'C');
Pop(x);
Pop(x);
Pop(x);
Push(x,'D');
c= GetTop(x);
printf("\n the top elem got is:%c",c);
DestroyStack(x);
getch();
}
jk88811 2005-05-10
  • 打赏
  • 举报
回复
我们老师要我们用堆栈做一个表达式求解, 可是我总是觉得写出来的堆栈这个ADT 不好用, 也不标准, 还麻烦大家提点意见啦, 有没有标准的堆栈接口呀???
jk88811 2005-05-10
  • 打赏
  • 举报
回复
多谢几位
lzwei3842 2005-05-10
  • 打赏
  • 举报
回复
不懂,帮顶
mostideal 2005-05-10
  • 打赏
  • 举报
回复
ding
i_tingfeng 2005-05-10
  • 打赏
  • 举报
回复
写得这么好,佩服
MagicCarmack 2005-05-10
  • 打赏
  • 举报
回复
楼上的真是热情啊
du51 2005-05-09
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
const int MAXLISTSIZE=100;
template <class DataType>
class SeqList
{
DataType data[MAXLISTSIZE];
int size;
public:
SeqList();
~SeqList();
int GetSize()const;
bool IsEmpty()const;
int FindElement(DataType &item)const;
DataType GetData(int pos)const;
void InsertItem(const DataType &item,int pos);
DataType DeleteItem(int pos);
void ClearSeq();
void ShowSeq()const;
};
template <class DataType>
SeqList<DataType>::SeqList(){size=0;}
template <class DataType>
SeqList<DataType>::~SeqList(){}
template <class DataType>
int SeqList<DataType>::GetSize()const
{
return size;
}
template <class DataType>
bool SeqList<DataType>::IsEmpty()const
{
return size?false:true;
}
template <class DataType>
int SeqList<DataType>::FindElement(DataType &item)const
{
if(size)
{
for(int i=0;i<size;i++)
{
if(data==item)return i;
}
}
return -1;
}
template <class DataType>
DataType SeqList<DataType>::GetData(int pos)const
{
if(pos<0││pos>size-1)exit(1);
else return data[pos];
}
template <class DataType>
void SeqList<DataType>::InsertItem(const DataType &item,int pos)
{
if(size==MAXLISTSIZE){cout<<"操作失败,空间已满!"<<endl;return;}
if(pos<0││pos>size){cout<<"操作失败,下标不对!"<<endl;return;}
for(int i=size;i>pos;i--)data=data[i-1];
data[pos]=item;
size++;
return ;
}
template <class DataType>
DataType SeqList<DataType>::DeleteItem(int pos)
{
if(!size){cout<<"操作失败,空间已空!"<<endl;exit(1);}
if(pos<0││pos>size-1){cout<<"操作失败,下标不对!"<<endl;exit(1);}
DataType temp=data[pos];
for(int i=pos;i<size-1;i++)data=data[i+1];
size--;
return temp;
}
template <class DataType>
void SeqList<DataType>::ClearSeq()
{
size=0;
}
template <class DataType>
void SeqList<DataType>::ShowSeq()const
{
for(int i=0;i<size;i++)
cout<<data;
cout<<endl;
}
int main()
{
int i;
SeqList<int> sl;
for(i=0;i<6;i++)sl.InsertItem(i+1,i);
for(i=0;i<6;i++)cout<<sl.GetData(i);
cout<<endl;
sl.ShowSeq();
for(i=0;i<6;i++)cout<<sl.DeleteItem(0);
cout<<endl;
cout<<sl.IsEmpty()<<endl;
sl.ShowSeq();
system("PAUSE");
return 0;
}
#include<iostream>
using namespace std;
const int MAXLISTSIZE=100;
template <class DataType>
class SeqList
{
DataType data[MAXLISTSIZE];
int size;
public:
SeqList();
~SeqList();
int GetSize()const;
bool IsEmpty()const;
int FindElement(DataType &item)const;
DataType GetData(int pos)const;
void InsertItem(const DataType &item,int pos);
DataType DeleteItem(int pos);
void ClearSeq();
void ShowSeq()const;
};
template <class DataType>
SeqList<DataType>::SeqList(){size=0;}
template <class DataType>
SeqList<DataType>::~SeqList(){}
template <class DataType>
int SeqList<DataType>::GetSize()const
{
return size;
}
template <class DataType>
bool SeqList<DataType>::IsEmpty()const
{
return size?false:true;
}
template <class DataType>
int SeqList<DataType>::FindElement(DataType &item)const
{
if(size)
{
for(int i=0;i<size;i++)
{
if(data==item)return i;
}
}
return -1;
}
template <class DataType>
DataType SeqList<DataType>::GetData(int pos)const
{
if(pos<0││pos>size-1)exit(1);
else return data[pos];
}
template <class DataType>
void SeqList<DataType>::InsertItem(const DataType &item,int pos)
{
if(size==MAXLISTSIZE){cout<<"操作失败,空间已满!"<<endl;return;}
if(pos<0││pos>size){cout<<"操作失败,下标不对!"<<endl;return;}
for(int i=size;i>pos;i--)data=data[i-1];
data[pos]=item;
size++;
return ;
}
template <class DataType>
DataType SeqList<DataType>::DeleteItem(int pos)
{
if(!size){cout<<"操作失败,空间已空!"<<endl;exit(1);}
if(pos<0││pos>size-1){cout<<"操作失败,下标不对!"<<endl;exit(1);}
DataType temp=data[pos];
for(int i=pos;i<size-1;i++)data=data[i+1];
size--;
return temp;
}
template <class DataType>
void SeqList<DataType>::ClearSeq()
{
size=0;
}
template <class DataType>
void SeqList<DataType>::ShowSeq()const
{
for(int i=0;i<size;i++)
cout<<data;
cout<<endl;
}
int main()
{
int i;
SeqList<int> sl;
for(i=0;i<6;i++)sl.InsertItem(i+1,i);
for(i=0;i<6;i++)cout<<sl.GetData(i);
cout<<endl;
sl.ShowSeq();
for(i=0;i<6;i++)cout<<sl.DeleteItem(0);
cout<<endl;
cout<<sl.IsEmpty()<<endl;
sl.ShowSeq();
system("PAUSE");
return 0;
}
-----------------------------------------------------------------------------
#include<iostream>
using namespace std;
const int MAXSTACKSIZE=100;
template <class DataType>
class SeqStack
{
DataType data[MAXSTACKSIZE];
int top;
public:
SeqStack(){top=0;}
~SeqStack(){}
void Push(const DataType &item);
DataType Pop();
DataType Peek()const;
bool IsEmpty()const;
int GetSize()const;
void ClearStack();
};
template <class DataType>
void SeqStack<DataType>::Push(const DataType &item)
{
if(top==MAXSTACKSIZE){cout<<"栈已满!"<<endl;return ;}
data[top++]=item;
}
template <class DataType>
DataType SeqStack<DataType>::Pop()
{
if(top==0){cout<<"栈空"<<endl;exit(1);}
return data[--top];
}
template <class DataType>
DataType SeqStack<DataType>::Peek()const
{
if(top==0){cout<<"栈空"<<endl;exit(1);}
return data[top-1];
}
template <class DataType>
bool SeqStack<DataType>::IsEmpty()const
{
return top==0;
}
template <class DataType>
int SeqStack<DataType>::GetSize()const
{
return top;
}
template <class DataType>
void SeqStack<DataType>::ClearStack()
{
top=0;
}
int main()
{
int i;
SeqStack<int> stack;
for(i=0;i<6;i++){stack.Push(i+1);cout<<i+1<<"入栈"<<endl;}
while(!stack.IsEmpty())cout<<stack.Pop()<<"出栈"<<endl;
system("PAUSE");
return 0;
}
zhang_jiang 2005-05-09
  • 打赏
  • 举报
回复
/* 出栈, 返回栈顶元素 */
int Pop(Stack *s, ElemType *x)
{
if(IsEmpty(s)) return 0;
*x= s->data[s->top--];
return 1;
}

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧