栈与队列,各有异同。

首先是两者的定义:

栈也称为堆栈,是一种线性表。

栈的特性: 最先放入栈中的内容最后被拿出来,最后放入栈中的内容最先被拿出来, 被称为先进后出、后进先出。

队列也是一种特殊的线性表。不同于栈所服从的先进后出的原则,队列的原则是先进先出。

队列在队头做删除操作,在队尾做插入操作。

 

 

然后是两者的异同点

不同点:

1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。

2.队列先进先出,栈先进后出。

3.顺序栈能够实现多栈空间共享,而顺序队列不能。

4.遍历数据速度不同。

栈只能从头部取数据,也就最先放入的需要遍历整个栈最后才能取出来。

队列则不同,它基于地址指针进行遍历,而且可以从头或尾部开始遍历无需开辟临时空间,速度要快的多。

相同点:

1.都是线性结构

2.插入操作都是限定在表尾进行。

3.都可以通过顺序结构和链式结构实现。

4.插入与删除的时间复杂度与空间复杂度上两者均相同。

 

再然后便是两者的表示和操作的实现

栈表示和操作的实现:

#include <iostream>
#define MAXSIZE 100//基础容量
using namespace std;
typedef struct
{
SElemType *top;//栈顶指针
SElemType *base;//栈底指针
int stacksize;//栈可用最大容量
}SqStack;

Status InitStack(SqStack &S)//初始化栈
{
S.base=new SElemType[MAXSIZE];
if(!s.base) exit(OVERFLOW);//内存分配失败
S.top=s.base;
S.stacksize=MAXSIZE;
}

Status Push(SqStack &S,SElemType e)//把元素e压入栈顶
{
if(S.top-S.base==S.stacksize) return ERROR;//栈满
*S.top++=e;//栈顶指针+1
return OK;
}

Status Pop(SqStack &s,SElemType &e)//取出栈顶元素,并删除栈顶
{
if(S.top==S.base)//top与base重合时,栈为空
return ERROR;
e=*--S.top;
return OK;
}

SElemType GetTop(SqStack S)
{
if(S.top!=S.base)
return *(S.top-1);
}

 

队列表示和操作的实现:

#ifndef STATICQUEUE_H_INCLUDED
#define STATICQUEUE_H_INCLUDED

template<class T>
class StaticQueue
{
public:

StaticQueue();
StaticQueue(int size);
~StaticQueue();
void enqueue(T data);
T dequeue();
bool isEmpty();
bool isFull();
int count();
void display();

private:

int rear;
int front;
int size;
const static int DEFAULT;
T* queue;

};

这些在课本上都有,下面说说遇到的问题:

对于作业3,可以说是屡战屡败,屡败屡战了,先是一点思路都没有,再到后来老师提示后有一点思路,但还是错误百出,再到后来参照书上的方法,还是错误,最后终于发现问题。话不多说,直接上代码:

#include <iostream>
#define MAXSIZE 100//基础容量
using namespace std;
typedef struct
{
SElemType *top;//栈顶指针
SElemType *base;//栈底指针
int stacksize;//栈可用最大容量
}SqStack;

Status InitStack(SqStack &S)//初始化栈
{
S.base=new SElemType[MAXSIZE];
if(!s.base) exit(OVERFLOW);//内存分配失败
S.top=s.base;
S.stacksize=MAXSIZE;
}

Status Push(SqStack &S,SElemType e)//把元素e压入栈顶
{
if(S.top-S.base==S.stacksize) return ERROR;//栈满
*S.top++=e;//栈顶指针+1
return OK;
}

Status Pop(SqStack &s,SElemType &e)//取出栈顶元素,并删除栈顶
{
if(S.top==S.base)//top与base重合时,栈为空
return ERROR;
e=*--S.top;
return OK;
}

SElemType GetTop(SqStack S)
{
if(S.top!=S.base)
return *(S.top-1);
}

Status Matching()
{
InitStack(s);
flag=1;
cin>>ch;
while(ch!='#'&&flag)
{
switch(ch)
{
case'{':
case'[':
case'(':
Push(S,ch);
break;
case')':
if(!StackEmpty(S)&& GetTop(s)=='(')
Pop(S,e);
else flog=0;
break;
case']':
if(!StackEmpty(S)&& GetTop(S)=='[')
Pop(S,e);
else flog=0;
break;
case'}':
if(!StackEmpty(S)&& GetTop(S)=='{')
Pop(S,e);
else flog=0;
break;
}
cin>>ch;
}
if(StackEmpty()&&flag)
cout<<"yes";
else cout<<"no";
}

这是错误的,无法输入空格,虽然与书本上的一致,但并不完善

 

 

#include<iostream>
#include<string>
#include <stdio.h>
using namespace std;

struct initstack {
char *top = NULL;//定义栈底指针
char*base = NULL;//定义栈顶指针
int stacksize;//定义栈空间长度
}S;//创建top指针和base指针

void Initinitstack(initstack &S) {
S.base = new char [101];//为栈创建空间
S.top= S.base;//表示空栈
S.stacksize = 101;//定义顺序栈长度
}//创建顺序栈

void push(initstack &S,char str){
*S.top = str;//将字符存入栈中
++S.top;//栈顶指针地址加一
}//入栈函数

char pop(initstack &S) {
--S.top;//栈顶指针下移一位
char str = *S.top;//取栈顶字符
*S.top = 0;//删除栈顶字符
return str;
}//出栈函数

bool matching() {
int flag = 1;string str;
getline(cin, str);//输入字符串
if (str.size()> 100) return 0;//字符串长度不得超过100
int count = 0;//定义基数
while (str[count] != '\0'&&flag) {//若出现左括号,则入栈
if (str[count] == '(' || str[count] == '[' || str[count] == '{'){
if (S.top - S.base != S.stacksize) {//判断栈满
push(S, (char)str[count]);//进行入栈
}

}
if (str[count] == ')' || str[count] == ']' || str[count] == '}') {//若出现右括号,则取栈顶字符
char temp = 0;
if (S.base == S.top) flag = 0;//若出现右括号并且栈空的情况,说明不匹配
else temp = pop(S);//栈顶元素进行出栈
switch (temp){//利用switch语句进行判断
case'(':
if (str[count] != ')') flag = 0;//匹配不成功
break;
case'[':
if (str[count] != ']') flag = 0;//匹配不成功
break;
case'{':
if (str[count] != '}') flag = 0;//匹配不成功
break;
default:
break;
}
}
++count;
}
if (S.top!=S.base) flag = 0;//最后判断栈空
return flag;//返回flag的情况
}

int main(){
Initinitstack(S);//创建顺序栈
if (matching()) cout << "yes";//调用匹配函数
else cout << "no";
return 0;
}

这个达到了题目要求,利用string函数代替了直接输入,解决了无法输入空格问题。

总之,第三章比起前面的内容,明显更难,但我们不能放弃,一定要坚持!加油!

posted on 2019-03-31 23:01  瓦砾之空  阅读(3229)  评论(2编辑  收藏  举报